Reviewer: Astra (GPT-6-Astra via Codex), whole-branch review requested by Paul, 2026-10-01.
VERDICT: APPROVE-WITH-NITS — feat/home-consumer at e8cde40c65a3bbfb55d89f2a4c02eef231981495, one merge-base diff against fetched main 25974c6. No blocking findings. This approval covers the reviewed head; a rebase needs its own passing gate/CI and conflict-resolution check.
- P3 / non-blocking —
internal/calendar/routes.go:45(enabled by the connect bump ingo.mod:8): revoked sessions still take the signed-in shortcut. The supplied ReadSession reads the session, not admission. After explicitly linking a Home identity, signing in and removing its address from the admission map,/signinredirects to/, which terminates at 404. The root/deep routes correctly refuse access, so this is neither an authorization bypass nor the automatic redirect loop seen in Sheets #39. It is a recovery dead end through the normal Sign in URL;/signin/localremains reachable. Fix: make the shortcut admission-aware, preserving storage-error handling, and give a refused identity a reachable sign-in/sign-out outcome. Add a regression following/signinafter revocation. - P3 / known, non-blocking —
internal/calendar/credits.go:30:no-referreron a page with Sign out can require a second click at Home. A redirect cannot restore referrer evidence already removed by the originating page. Home safely presents “Finish signing out”; it does not accept an evidence-free logout or redirect elsewhere. Fix: usestrict-originon non-sensitive pages with the account menu, retaining no-referrer on outbound credits links. This is the explicitly accepted limitation in the switch plan, not a merge blocker. - P3 / rebase integration —
internal/calendar/home_consumer_test.go:75–80: its literal trailing slash disagrees with #17's existing switcher. On a second detached worktree at #17 head 5faf837, copying this new test file makes only All apps fail: #17 emitshttps://directory.example.test, this test requireshttps://directory.example.test/. The other two new tests pass. Adjusting the scratch assertion to #17's equivalent root URL makes all three pass. Fix during rebase: assert the link's parsed origin/root path, or standardize the rendered href deliberately; do not restore the old account menu just to satisfy the string check.
Security: audited the complete connect delta from 5b8d841 to 01166fc and Home main 7a0f19c. First-hop sign-out remains CSRF protected; its fixed 307 preserves the empty form POST, clears the app session/handoff cookies, sets no-store and the required referrer policy, and targets only the validated issuer allowed by CSP. Home's registered-origin check, null-Origin/referrer handling and fixed registered return match it. The assertion exchange remains audience/nonce bound. Local-person resolution uses explicit links with per-request current admission, never Home-subject/email inference or auto-creation.
Verification: GOTOOLCHAIN=go1.26.5 CGO_ENABLED=0 TMPDIR=/tmp make ci passed. Hub CI PASS at e8cde40, CLI exit 0. Extra scratch router probes passed for hostile/missing-origin and same-site first-hop CSRF rejection without revoking the session, unsafe absolute/scheme-relative/encoded-slash/backslash/auth/dot/control return paths, exact query preservation, and revoked-user termination at 404 with local recovery reachable. Home sign-out/assertion tests and connect tests also passed. No production config or optional browser SSO stack was used.
Mutation proof: removed h.directory = homeSettings.Directory in scratch. The new All apps test failed specifically because the configured link disappeared; restore made the uncached test pass.
Rebase after #17: keep its 01166fc pin, h.directory, viewer resolver, Chrome field and calendarChrome switcher. Drop #23's superseded handlers-field/PageData/template plumbing rather than adding a second link or old menu. Preserve #17's other fixes. Carry the three new consumer tests, adapting finding 3, and reconcile the equivalent 307 router-test assertion. Read-only merge-tree reports conflicts in app.go, handlers.go, homeroutertest.go, render.go and templates/layout.html. #17 already supplies the production behavior; #23 should become regression coverage plus any deliberate normalization. Rerun make ci and hub CI on that actual rebased head.
Order: Docs #73 can land independently first; Calendar #17 → rebased #23; Memoria #20 → #21; Calls #22 → its unfinished chrome branch. This review does not approve the whole of #17.
Detached /tmp review worktrees only; mutations restored; no branch edits/commits/pushes/merges or existing-checkout moves. Posted as the agent account under the repository's amadan skill, never -as-human.