Dated narrative record of build/debug sessions for delayrepay. The distilled, still-actionable technique from these sessions lives in delayrepay/lessons — read that first; come here only for the blow-by-blow of a specific run, or to see how a technique was originally discovered. Role/infrastructure bugs found in these sessions are tracked to closure in ansible/todo, not here.
The first FULLY end-to-end Delay Repay claim was driven through the AWS browser host (login → journey → delay → ticket → price/reference → photo upload → review) and submitted — claim ref GWR-1210-786-241 (26 Aug, Bristol Parkway → Paddington, Advance Single, £109.50, 15–29 min band). The decisive factor was keepalive.py running: an earlier manual drive with NO keepalive hit the session timeout and was silently logged out mid-claim, losing everything (the ticket number being typed landed in the re-shown login box). With keepalive the second run completed at leisure while a human reviewed.
Host bring-up needed manual recovery this run: VNC dead on first boot (the ~/.config/tigervnc migration bug), and Firefox autofill failed because logins.json was missing from the live profile. Both are tracked as role fixes in ansible/todo.
Also this session: a Claude Code permission-prompt loop from per-crop exact-match allow rules on magick calls (fixed with wildcard rules — see README/lessons) and the discovery of the tiered locator / OCR recipes now written up as technique in delayrepay/lessons.
The return leg was submitted end-to-end — GWR claim ref GWR-3481-106-440 (27 Aug, London Paddington 19:18 → Bristol Parkway 20:27, 15–29 min band, Advance Single Paper, £48.00, ticket 11694). Delay confirmed: booked 19:18 was the Fastest/Direct service due 20:27 (per National Rail; the 19:12 was slower, due 20:40) vs GPS actual arrival ~20:48 = ~21 min.
This run discovered the 'Manually enter your journey' branch (the booked 19:18 had been pulled from the timetable at short notice, so Search returned nothing usable), the keyboard date-picker navigation, and the window-maximise rule — all now written up as technique in delayrepay/lessons. keepalive's reactive click was found NOT to actually extend the session (still open, tracked in delayrepay/toolkit Current gaps). reCAPTCHA at Submit was confirmed as an irreducible human step. The role bugs from the morel session (VNC-on-boot, Firefox profile/login injection, no profile created at all, evidence images not staged) all recurred; tracked in ansible/todo.
Checked other evenings for delays not yet claimed by joining GPS to the WTT timetable tables — see delay-review-2026-09-03 for method and findings. Headline: 23 July 2026 return leg (1B32, Paddington→Swansea) looks like a genuine ~48 min delay, corroborated by a ~25 min stationary GPS trace at the Paddington platform — not claimed at the time, ticket detail still needed.
Outbound leg claim submitted — Bristol Parkway → London Paddington (06:59→08:16, train 1L04), delay 15–29 min; Advance Single, Paper, ticket no 63678, £99.00 (claim ref GWR-2238-489-127, see delayrepay/claims). Driven end-to-end on a fresh host (chanterelle) after porcini's browser profile got tangled from reuse; reCAPTCHA again required a human solve.
Re-provisioning porcini initially failed at 'Wait for SSH' even though the instance was healthy: awslaunch.py's security-group allowlist had accumulated six stale old-kelp /32s and was missing kelp's current egress IP (kelp's IP changes every session, and the reuse path didn't touch the SG). Fixed manually, then in the script (ensure_security_group now runs on reuse too, with pruning) — tracked to closure in ansible/todo.
Root-caused the Firefox-login autofill failure properly this session: it was not (only) a profile mismatch — the mint task killed Firefox by launcher-PID only, so a surviving process rewrote logins.json on exit and wiped the just-injected login. Fixed in the role by using firefox-esr -CreateProfile (no running session to clobber it) instead of the mint-then-kill dance; validated clean on a later fresh provision (maitake). Full status: ansible/todo.
Also found: collection receipts are photographed and uploaded to WebDAV reclaim/ within ~15 minutes either side of the ticket photos (same day), so fetch ticket + receipt together by timestamp.
The original gwr-view client script cached only one host's cert at a time, so enrolling a new host overwrote the previous one's and only one stunnel section could exist at once. Replaced (on pomelo) by gwr-enroll-host.sh, giving each host its own cert directory and named stunnel section so several hosts can have live tunnels simultaneously. Current design and usage are documented directly in delayrepay/viewer-setup rather than here.