Claude: changes for issue #186 #187
No reviewers
Labels
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Grandiras/Ponente!187
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "claude/issue-186"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #186.
🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
✅ Verdict: approve — no blocking issues found.
This implements the
/launchreopen-where-you-left-off feature (issue #186) end to end:LastPage.cs(the single rule used both for writing the cookie and for resolving the redirect), the/launchendpoint inProgram.cs,MainLayout.razorrecording navigations viaNav.LocationChanged, theprefs-interop.jscookie writer, the manifeststart_urlchange, and matching unit tests (LastPageTests), e2e tests (prefs.spec.js,icons.spec.js), and documentation updates (docs/ui.md,docs/orientation.md,docs/frontend.md,CLAUDE.md).I checked the parts most likely to hide a bug:
LastPage.Remembercorrectly delegates toReturnUrl.Sanitizefor the open-redirect gate (protocol-relative, backslash-relative, control characters all rejected), so a hand-edited cookie can't turn/launchinto an open redirect — verified against the actualReturnUrl.csimplementation, not just the docstring's claim."id": "/"before this change, so the newicons.spec.jsassertion (expect(manifest.id).toBe('/')) isn't asserting on a field the diff forgot to add./launchis intentionally left off anyRequireAuthorization()call, and the app has no global fallback authorization policy (Program.cscomment: "nothing is forced as a fallback so the OAuth library's /atproto/* endpoints stay reachable"), so the endpoint really is reachable unauthenticated as the docs describe — the destination page's own[Authorize]/policy is what gates a stranger.DocumentationTests's newConstantRouteresolution correctly extractsLastPage.RoutefromServices/LastPage.csso the documented/launchroute doesn't go stale relative to the literal.MainLayout'sIAsyncDisposablecorrectly unhooksNav.LocationChangedbefore disposing the JS module, and the module import mirrorsNavHeader's existing./js/prefs-interop.jsimport (ES module caching means this costs nothing extra).NotPlaces) is deliberately fail-open for new pages, consistent with the stated rationale, and query-stripping/case-insensitivity both check out against the test cases.One minor, non-blocking note:
OnLocationChangedfires_ = InvokeAsync(RememberPageAsync)without awaiting or serializing against prior in-flight calls, so on a rapid multi-hop navigation within one circuit (e.g. a same-circuit redirect chain) the JS cookie-write calls could theoretically complete out of order and leave a slightly stale page remembered. Given this is a best-effort convenience cookie with a graceful failure story already built in, I wouldn't block on it, but it's worth being aware of if a future spec exercises fast redirect chains.Overall this is careful, well-tested work that matches its own extensive documentation.
⏱ 1m 41s · 8 turns · tokens: 40.3k in / 8.3k out (+395.3k cache-read)
📜 Full session transcript