# 2026-07-27 · TARS · Workday picker & popup-scope fixes (multi-hour autopilot)

## Result: 0 submissions. Walker reached Self Identify page on Capital One (final step before Review — deepest ever). Remaining blockers are per-tenant idiosyncrasies (session lockouts, LLM answer quality on typeaheads).

## Code changes deployed (all live, syntax-checked, api restarted):

1. **`answers.py`** — added `"region"` to `address_state` matchers. Workday's "Region" label resolves to `Ohio` from profile.
2. **`playwright_base.py` searchBox picker** — 3-tier ranking (exact → prefix → substring) + decoy penalty for `Minor Outlying / Territory / (+N)` entries.
3. **`workday.py` button-combobox fallback** — same tiered + phone-code leak guard.
4. **`playwright_base.py` `target_url` routing** — `apply_url or url` (was reversed) so Workday tenants route to local Chromium via `_BD_BLOCKED_DOMAIN_SUFFIXES`.
5. **`routes.py` post-submit reconciler** — Ready-to-Submit rows don't demote to Failed on transient walker-stuck signatures.
6. **`autonomous.py` + `workday.py`** — removed auto-flip of `Job.status='skip'` on false dead_listing detection.
7. **`applications.html`** — status labels neutral past-tense (no bucket/status conflict).
8. **`playwright_base.py` native `<select>` tiered picker** — parallel to button-combobox picker. Country* on native selects now picks "United States of America" over "Minor Outlying Islands".
9. **`playwright_base.py` button-combobox tiered picker** — replaces `get_by_role().first` (always picked first substring hit).
10. **Popup-scoped option lookup** — added `_tarsPopup(el)` helper (via aria-controls / aria-owns / aria-activedescendant / geometry) in BOTH `playwright_base.py` button picker AND `workday.py` fallback picker. Prevents cross-widget popup leakage (Region field grabbing Country Phone Code's `(+1)` entries).

## DB surgery (persistent):

- Deleted poisoned rows 487, 488, 809, 810 (`Region → 'United States Minor Outlying Islands (+1)'` — LLM guesses).
- Inserted user-source `Region → 'Ohio'` for profiles 2 and 3 (rows 815, 816).
- Inserted user-source `Country → 'United States'` for profiles 2 and 3 (rows 126, 127).
- Updated `Country Phone Code* → 'United States (+1)'` source=user for profiles 2 and 3.
- Deleted stale `Date* → 07/02/2026` rows (438, 439) so signature date resolves fresh each walk.

## Deepest walker reach (Capital One 722):

**Reached Self Identify page** (Voluntary Disclosures + Self Identify + Review checked-off in the progress bar). Screenshot showed:
- All 5 prior steps green-checked ✓
- Self Identify form fully filled: Language=English, Name="Michael Holleran", Employee ID="N/A", Date=07/02/2026, Disability=No
- ONLY blocker: Workday returned server-side "Page Error - Error Code: I|5d96482e-..." — likely stale date (fixed subsequently by purging bank rows 438/439).

## Remaining blockers (would need per-tenant work):

- **Capital One 722** — after ~6 re-walks, the tenant's account entered a locked/broken state. Every subsequent walk fails at step 3 (`no Next/Review button` on `/apply/applyManually`). Not fixable in code; needs either lockout expiry OR account password reset via email verify.
- **Illinois Tool Works 723** — walker successfully fills Country, State, Phone Type on every retry. But "How Did You Hear About Us?" typeahead searchBox can't commit any option (LLM answered "Website" — didn't match any of ITW's 10 options). Walker loops re-filling the same page.
- **Region cross-widget leak** — my popup-scope fix works for the initial pick, but the `unfilled` fallback path in workday.py still scrapes document-wide (fixed one call site at line 1910, missed 2 more at lines 2035, 2103).
- **`How Did You Hear About Us?` on many tenants** — needs a matcher / user-source answer per tenant, or a smarter typeahead commit verifier.
- **Slalom** — apply_url is search page, not job form. Custom marketplace applier needed.

## Files touched:

- `src/jobscraper/appliers/answers.py`
- `src/jobscraper/appliers/playwright_base.py`
- `src/jobscraper/appliers/workday.py`
- `src/jobscraper/worker/autonomous.py`
- `src/jobscraper/web/routes.py`
- `src/jobscraper/web/templates/applications.html`

## Next session priorities:

1. **Universal `How Did You Hear About Us?` handler** — for each Workday tenant, first opens the searchBox popup, scrapes actual options, then picks best match. Store per-tenant answer in question_bank once found.
2. **Complete the popup-scope migration** — 2 remaining call sites in `workday.py` (lines ~2035, ~2103) still use `e.ownerDocument.querySelectorAll(...)`.
3. **Session state debugging on Capital One 722** — post-verify redirect loop diagnosis. Might need to clear cookies more aggressively or bypass account creation for repeat tenants.
4. **Slalom** — needs custom applier for `jobs.slalom.com/careersmarketplace/*` (Salesforce careers).

## App IDs of interest:

- 722 Capital One (job 7104) — reached Self Identify; then tenant lockout; final error is auth loop at step 3
- 723 Illinois Tool Works (job 7604) — walker loops on source_hearing searchBox; Country/State/Phone all pick correctly

## Standing rules confirmed in play this session:

- [[feedback-tars-auto-kill-hung-walkers]] — killed 6+ hung Chrome batches over the session
- [[feedback-tars-autonomous-fix-and-retry]] — iterated ~15 fix-and-retry cycles without asking
