🤖 Whole-branch review by Claude Fable 5.1 (agent account), per AGENTS.md §Process. Branch feat/door-copy @ fbd14e7, read as one diff against merge base cce1101 (= origin/main). Review only; nothing edited.
VERDICT: APPROVE-WITH-NITS
Nothing blocking. Verified, then findings, then the merge-order risk the brief asked about.
Verified
- 15 minutes is true. keymaildev/signin v0.1.1
flow.go:186:now.Add(orDuration(f.LinkTTL, 15*time.Minute)). Nobody overrides it: Homeinternal/home/signin.gonewFlow(origin/main 7a0f19c) sets noLinkTTL; rastrilloauth.Newat main 2fafa12 sets none (and rastrillo #56 pins it to the same 15m explicitly); fichas'chore/door-copybuildsauth.Configwithout it; no Oficina app setsLinkTTLanywhere on main. - Theme byte-identical. The diff touches
chrome/only;themetests (incl.TestMatchesDayByteForByte) pass locally and on the hub. - Prefix lint (
internal/lint) passes; gofmt, vet, build pass. - Gate.
make testgreen locally on a scratch worktree; hub CIsuccessat fbd14e7 with all five steps logged (modcache, vet, fmt, build, go-test with the chrome package listedok), so this is not a "your code wasn't there" green. - Tests go red when they should. Mutation 1:
English.Submit→ "Email me a link" failsTestDoorCopyIsPinned(2 errors) andTestTheDoorDrawsItsOwnCopy(2). Mutation 2: title separator "·" → "-" failsTestDoorTitlesandTestDoorCopyIsReplaceablePerLocale. Reverted. - Templates unchanged on purpose and still correct:
signin.htmlkeeps.Heading/.AddressLabel/.Help/.Submit, which now resolve to the methods onSignIn;SignInNotice.Heading/.Body/.Linkstay fields. Twelve-locale map inchrome_test.go:85has all twelve (en de es fr it pt nl pl ar ja zh ko). - Copy deck reads as good English. Short, plain, tells the reader what to do. "If that address can sign in here, we’ve sent it a link" avoids address enumeration. "Sign in" on the button and "Sign in" as the signed-out primary are consistent with Paul's 2026-10-01 ruling; "Home" appears nowhere user-facing (the retired-copy test pins that). No change requested to the deck.
Findings
- medium (scope, not code) — the breaking change hits six apps, not three.
chrome/chrome.go:201-215removesHeading/AddressLabel/Help/Submit. On origin/main these are set by Docs (internal/docs/auth.go:506-510), Sheets (internal/sheets/signin.go:116-120), Slides (internal/slides/auth.go:628-633), Calendar (internal/calendar/signin.go:37-42), Memoria (internal/memoria/handlers.go:1264-1268) and Calls (internal/calls/auth.go:198-201). All six fail to compile on re-pin. Per app the change is: drop the four fields from thechrome.SignInliteral (and therastrillo.Tkeys they read in Docs/Slides); build the sent state withSignInNotice{Icon, App, Sky}.Sent(againHref)and the signed-out page with.SignedOut("/signin")instead of hand-writtenHeading/Body/Link; take<title>from.Page()/.Title(); setauth.Config.Subject = chrome.EmailSubject(App). The eightchore/door-copybranches already do this (checked Docs' diff), so this is a correction to the discussion's and brief's "Docs, Sheets, Slides" list, not new work. Acceptable: a compile failure is exactly the enforcement the "one copy set" goal needs. - low —
door.go:58,86,116anddoor_test.go:10,43cite "spec §9.2" and "§10" but no document in this repo or in oficina/polish-audit (SSO-SWITCH.md has no §9/§10) carries those sections; Docs'home_render.gocites the same §9.2. Name the document in the comment so the citation is checkable. - low —
DoorCopy.EmailSubject/EmailBodyare locale fields nothing reads.SignInEmail,EmailSubject,EmailBody(door.go:135-149) readEnglishonly, so a locale's email copy is unreachable. Either take a*DoorCopy(as the page helpers do viacopyOf) or leave the two fields out until a caller exists — the repo's own rule is no interface ahead of a caller. - low —
signedOutBody(door.go:66) uses the copy string as a Printf format. A localeSignedOutBodywithout%srenders "%!(EXTRA string=…)"; a stray%in a translation breaks the sentence. A{app}token withstrings.ReplaceAll, or a test over the locale set, closes it. - low — twelve locales: met mechanically, not in content.
Copyreplaces the whole set and the test runs it across all twelve, which is the same contract as the rest ofchrome. But no translation exists anywhere — Docs' and Slides' door strings on main were English-only too (render.gomap; onlyen.toml). Please state in this discussion that translations are estilo's follow-up (achrome.Copy(locale)or similar) and never an app's, or the "one copy set" guarantee re-fragments the first time an app translates its own door. - low —
var minutes(door.go:39) is a generic package-level name inchrome;lifetimeMinutesorlinkMinuteswould not collide with the next person's duration. - low — two constants, no link.
chrome.LinkLifetimeand rastrillo's newauth.LinkTTLmust agree and nothing checks it; estilo still pinsgithub.com/carlosframework/rastrillo v0.23.0, which has noauth.LinkTTL, so it cannot today. When estilo moves toamadan.net/rastrillo, addLinkLifetime == auth.LinkTTLtoTestDoorCopyIsPinned. - info — interim mismatch, already acknowledged in rastrillo #56. Apps pinned to the 2026-09-08 rastrillo pseudo-versions keep sending keymail's "expires shortly" body while the door promises 15 minutes, until each bumps rastrillo past #56 and sets
Body: chrome.EmailBody(App). Worth a line in the app branches' descriptions so it is not reported as a bug again.
Merge order and the re-pin
- All eight
chore/door-copybranches pinamadan.net/oficina/estilo.git v0.0.0-20261001075355-fbd14e759027, i.e. this branch's tip. - How this lands decides whether the re-pin is hygiene or necessity. estilo's main has actually been landing by merge commit (
cce1101 Merge branch 'signin-foot-link',4120143 Merge branch 'signin-door'), not by squash, whatever AGENTS.md says. With a merge commit fbd14e7 stays reachable from main and every existing pin keeps resolving; re-pinning to the tip is tidiness. With a real squash, fbd14e7 is reachable only from the branch ref: delete the branch and a cold module cache (the hub runners, per the 429 incident) cannotgo mod downloadit, and all eight app branches go red at once. If squashing, re-pin all eight before the branch ref is deleted. - Four app branches are behind their own main and need a merge of main as well as the re-pin: docs (base d40fbd1, main cc1bd3c), calendar (25974c6 / dbee441), memoria (97b8a23 / 0cc9d09), meet (84ed5dc / bf4e24d).
- A re-pin changes go.mod and go.sum, so each app's CI must be re-run on the re-pinned commit, not trusted from the current green.
- fichas
chore/door-copyis not a copy chore: 111 files, +16,356 lines over origin/main fab37e4 (the design-only commit). It carries the whole app. It needs its own whole-branch review under its real name. Home's (18 files, +233) is also larger than a copy change; worth a look rather than a rubber stamp.
Reviewed with: scratch worktree at fbd14e7, make test, two mutations, amadan ci status -json, keymaildev/signin v0.1.1 from the module cache, origin/main of home, fichas, docs, sheets, slides, calendar, memoria, meet.