VERDICT: CHANGES-REQUIRED
Reviewer: Astra (GPT-6-Astra via Codex). Whole-branch review of feat/r2-shared-chrome at 732122b8bd4055f89deb037766921c2f22e07c04, against fetched origin/main bf4e24d08329d5fd61ebf8a69ff649cdc6dec375. Followed REVIEW-BRIEF.md, the target's AGENTS.md, the shared-chrome spec, Paul's R2 rulings, both Calls audits, all calls-* memory notes, and the earlier Docs #65/#68, Sheets #39, Slides #14, Calendar #17 and Memoria #21 records. The blocker is the required integration with current estilo; the reviewed pin itself passes its gates.
- P2 / blocking integration —
internal/calls/auth.go:266–270,go.mod:6: the required estilo-main repin does not compile. The branch currently builds only against its older759a8ffpin. I built the exact Calls source against estilo main 0b4d92c using a scratch alternate modfile: Go reports four unknownchrome.SignInfields, Heading, AddressLabel, Help, Submit. Estilo's danger branch merges cleanly into that main, so repinning after its merge necessarily brings in the door-copy API too. Fix: integrate Calls door-copy #23, remove all four overrides (including this branch's new Help), and pin the estilo main revision containing both changes. Removing those four fields in scratch makes the compile pass. Retain this branch'sOpenSource, validated Return, error messages andsigninAgainretry destination. When adopting.Sent(...), passa.signinAgain(r, ""), not a bare/signin; otherwise the earlier Docs/Slides retry bugs return. Carry #23's email subject and.SignedOut(...)copy. Keep R2's central title composition: do not append Calls twice by feeding a complete.Title()into TitleParts. Re-run the final integrated gates before squash.
- P3 / low, nonblocking —
internal/calls/static/calls-shell.css:24,internal/calls/templates/share.html:6: the hidden-control trap from Docs #65/#68 recurs. The newly added.calls-share-actions { display: flex }overrides the browser's[hidden]rule. Through the real Share POST in a Chromium context with JavaScript disabled, the actions container hashidden === truebut computeddisplay: flex; Copy link is 81.5 × 33.875px and Share is 69.89 × 33.875px, both visible and inert. Clicking Copy leaves the status empty. The invitation remains manually copyable, so this does not block the merge. Fix: explicitly hide.calls-share-actions[hidden](or apply flex only to:not([hidden])), and protect the optional Share button's own hidden state from[rst-btn]as well. Add a browser assertion of actual visibility without script and withoutnavigator.share, plus the enabled Copy path; testing the literal hidden attribute is insufficient.
- P3 / low, nonblocking —
internal/calls/errors_test.go:14, wiring atinternal/calls/app.go:443: the panic test bypasses the router registration. Removingr.Use(a.recoverToErrorPage)leavesTestAPanicIsTheErrorPageWithAReferencegreen. This is the disclosed Docs/Memoria coverage gap again. The registration is correct today. Fix: keep the helper test and add a real-router regression. In scratch I made the return-cookie clock panic while requesting/signin/local?return_to=/settingswith HTML Accept: the real router produces 500 plus Reference without the private sentinel; the same probe fails with an escaping panic when registration is removed. Also cover signed-in identity and non-HTML output through that path.
Merge order: land approved estilo danger #20 onto estilo main first. Between the two Calls branches, land the updated door-copy #23 first, then bring that actual squash result into R2, resolve toward the combined behaviour above, repin to combined estilo main, and land R2 only after its resulting head is green. Door-copy may independently land against estilo 0b4d92c earlier; R2 needs both prerequisites. Do not solve the conflict by retaining the old estilo pin or by reverting #23's copy. No merge was performed in this review.
Settings ruling: keeping Settings in Meetings · Settings navigation is acceptable. It edits team meeting defaults and agents, not account identity; §12.1 explicitly prescribes that nav even though §8.2 also lists an account item. The documented single-location choice avoids duplication, marks the current page, and works in the narrow Menu. The room's no-bar design and fixed dark appearance are also accepted; its title menu now has the checked identity/navigation/Help/Sign out wording and order, and sits above the notices.
Verification on the exact reviewed target:
GOTOOLCHAIN=go1.26.5 CGO_ENABLED=0 GOFLAGS=-count=1 make ci: exit 0, including migration consistency and credits. Hub CI also reports passed for 732122b.GOTOOLCHAIN=go1.26.5 CGO_ENABLED=0 make browser: exit 0; 43 distinct scenarios started and all 43 passed, none skipped (869.448s). Counted the individual RUN and PASS names against the harness, including chrome, guestdirect, guest, removed, allowlist, signedout and scriptless. The 15 Node test files ran 342 tests, zero failures/cancellations/skips. Chromium used both required fake-media flags.- Shared
r2-chrome-check.mjswithr2-calls-check.config.mjs: 831 checks passed, at 1440/840/800/390/320, signed in and out. This supplied configuration has the switcher disabled; I am not claiming a Home switcher browser run. - Room CLS: the committed chrome scenario actually ran eight direct loads, worst 0.0000. A separate eight-load run additionally asserted successful admission and a 1400 × 860px self tile on every load, again worst 0.0000. Independent fresh checks: desktop holding 0.0006, holding→room 0.0000, direct room 0.0000; phone 0.0007 / 0.0003 / 0.0003. The full scenario's holding load measured 0.0017, still below 0.01. Inspected all 33 supplied
r2-calls-after-*screenshots. - Three new regression tests were each made red by changing production behaviour in scratch: HTML for all Accepts →
TestErrorPagesAreSplitByAccept; creditsno-referrer→TestPagesWithSignOutSendStrictOrigin; omitted revoked-member sign-in check →TestARemovedHomeMemberIsNotBouncedBetweenSigninAndThePage. Each exited 1 for the expected assertion. Restored source and reran all three green. - The guest
/m/guard is retained. Non-HTML missing-route/meeting responses remain plain text; room.js'sreadRefusalis unchanged and still recognizes redirected or 401/403 sign-out responses. The 307 fix is byte-identical:callscore/session.goand its tests have the same Git blobs as bf4e24d, andTestSignOutAcceptsTheHomeChainpasses. - Return-cookie review and independent probes passed: separate derived key; origin-bound
calls.return.v1:<origin>purpose; strict/canonical encoding; one cookie; checked issued/expiry with a 600-second maximum; SafePath validation; normal/j/capability paths excluded. Wrong key/origin, duplicate cookies, expired and future-issued cookies were rejected. Home local and forced-local entry both retained/settings?from=mailthrough sent → different address → second submission → verification. - Confirmed member removal is distinguished from database failure. Existing guarded-page tests pass; my additional
/signinprobe with the persons table temporarily unavailable preserved the session and allowed Settings after recovery. Open source and Share send strict-origin; native hand-off success pages omit the account menu while retaining no-referrer. - Appearance is server-rendered from the per-app cookie. Real standalone requests and Home router probes reject absent/cross-origin CSRF evidence with 403 and no appearance cookie; same-origin Home POST succeeds.
- The starter's time zone is untrusted input, but is not interpolated into markup or SQL:
callZonebounds and validates it throughtime.LoadLocation, rejects Local/unknown/traversal inputs, andcallTitleformats a server timestamp through the resulting location. The raw submitted zone never becomes the title; normal template escaping and sealed storage remain intact. No new XSS or injection found.
All tracked mutations and temporary probes were confined to disposable /tmp worktrees and restored. Existing checkouts were not moved or edited; no commits, pushes or merges were made. Disk was checked with the requested command (48 GiB free initially, 47 GiB during the gates).