🤖 Opened by Claude (Opus 5.5), agent account.
Why
polish-audit r3 SUMMARY items 6/7: every app's door said different things. The words now live in estilo's door (chrome.English, estilo feat/door-copy fbd14e7, discussion oficina/estilo #19). Calendar pins it and drops its own copy. Rulings that bind this branch:
- Paul, 2026-10-01: the submit reads "Sign in", never "Email me a link".
- Paul, 2026-09-23: Home is never named to people.
What changed (branch chore/door-copy, 01c34a3)
go.mod/go.sum: estilo → v0.0.0-20261001075355-fbd14e759027.internal/calendar/signin.go: - Deleted from the chrome.SignIn literal: Heading "Sign in", AddressLabel "Email address", Help "We email you a link. There is no password to forget.", Submit "Email me a link", and the marketing Lede "A calendar for one team, on one instance.". - Sent state: the hand-built notice ("Check your email" / "The link works once, and expires shortly." / "Send another link") is replaced by chrome.SignInNotice{…}.Sent(r.URL.Path). The againHref logic is unchanged: it still links to /signin, or to /signin/local when Home is on. - The form.Lede = "Check your email. The link works once, and expires shortly." state is ?sent=1 together with an error (failed). The auth plugin never redirects there itself, but the page draws both facts rather than picking one. It is not the plain sent state, so it keeps the form and its error, and its lede is now the door's chrome.English.SentBody (no "shortly"). That is the only Lede Calendar still sets, and only because it carries a real state message. - Titles: h.page(r, "Sign in", …) becomes form.Title() / notice.Title(). The layout prints {{.Title}} verbatim (no app suffix), so this uses .Title(), not .Page(). render.go and layout.html are untouched. - signedOutDoor now returns chrome.SignInNotice{…}.SignedOut(signin).internal/calendar/home.go: connect's "signedout" state draws the door's signed-out card ("You’re signed out" / "You’ve signed out of Calendar on this device." / "Sign in"). Its href is still connect's data.Action. The title is "Signed out · Calendar". The other connect states keep connect's page and title.internal/calendar/auth.go: rauth.Config.Subject "Your calendar sign-in link" becomes chrome.EmailSubject("Calendar") ("Sign in to Calendar").
Tests: red, then green
Updated (not deleted) internal/calendartest/signin_door_test.go and internal/calendar/home_door_test.go. They now pin the submit "Sign in" and the absence of "Email me a link", "There is no password" and "A calendar for one team". They also pin the help line, the sent body, "Use a different address", "You’re signed out" and its sentence, the signed-out Sign in href, the absence of "Home" on /signed-out, the absence of "expires shortly" and "Send another link", the ?err=expired&sent=1 state, and the three tab titles.
Before the estilo bump and the code change:
signin_door_test.go:34: sign-in page is missing "<title>Sign in · Calendar</title>"
signin_door_test.go:34: sign-in page is missing "type=\"submit\">Sign in</button>"
signin_door_test.go:34: sign-in page is missing "We’ll email you a link that signs you in. It works once and expires in 15 minutes."
signin_door_test.go:42: sign-in page still says "Email me a link"
signin_door_test.go:42: sign-in page still says "A calendar for one team"
signin_door_test.go:96: /signin?sent=1 is missing "<title>Check your email · Calendar</title>"
signin_door_test.go:96: /signin?sent=1 is missing "Use a different address"
signin_door_test.go:107: /signin?sent=1 still says "expires shortly"
home_door_test.go:25: GET /signed-out is missing "<title>Signed out · Calendar</title>"
home_door_test.go:25: GET /signed-out is missing "You’re signed out"
home_door_test.go:30: /signed-out names Home to people
--- FAIL: TestSignInPageIsTheDoor / TestSignInDoorOutcomes / TestHomeSignInPagesAreTheDoor
After:
--- PASS: TestSignInPageIsTheDoor
--- PASS: TestSignInDoorOutcomes
--- PASS: TestHomeSignInPagesAreTheDoor
make ci exits 0: vet, fmt-check, all tests, and "migration check: models and migrations agree". On a loaded machine two unrelated timing tests each flaked once (TestTheGateRefusesTheSixtyFirstRequestInAMinute, TestTransientControlFailureAtBootRecovers). Both pass in isolation and on rerun.
Local verification (development, no Home; local-signedout.mjs, 1440 px)
| path | title | h1 | door button | help / body | link | |---|---|---|---|---|---| | /signin | Sign in · Calendar | Sign in | Sign in | We’ll email you a link that signs you in. It works once and expires in 15 minutes. | Open source | | /signin?sent=1 | Check your email · Calendar | Check your email | — | If that address can sign in here, we’ve sent it a link. It works once and expires in 15 minutes. | Use a different address → /signin | | /signin?err=expired | Sign in · Calendar | Sign in | Sign in | error "That link has expired. Ask for a new one." + door help | Open source | | /signin?err=expired&sent=1 | Sign in · Calendar | Sign in | Sign in | lede = door sent body, error, door help | Open source | | /signed-out | 404 in local mode (see below) | | | | |
Note: the script's button column reads empty for Calendar. Its selector form button finds the hidden Light/Dark/Auto theme menu first. [estilo-signin] button[type=submit] reads "Sign in", and the HTML has no "Email me a link". The Home-configured /signed-out is covered by TestHomeSignInPagesAreTheDoor: title "Signed out · Calendar", "You’re signed out", "You’ve signed out of Calendar on this device.", href="/signin">Sign in, no "Home".
Left over / out of scope
- No local signed-out page. Without Home,
/signed-out is 404 and local sign-out redirects to /signin (rastrillo auth's Signout). Calendar has no local "Signed out · Calendar" page to retitle. Adding one is a behaviour change and was left out of this copy branch. - Email body. rastrillo auth has no
Config.Body yet, so the body is still rastrillo's own. Follow-up once the rastrillo branch drafting Config.Body lands: set Body: chrome.EmailBody("Calendar"). - The error sentences ("Too many attempts…", "That link has expired…", etc.) are still Calendar's. The door does not own them.
Dependency
Must not merge before estilo feat/door-copy lands. After its squash, re-pin to estilo main (GOPRIVATE=amadan.net go get amadan.net/oficina/estilo.git@main && go mod tidy). The pinned fbd14e7 will not be on main.
Expected conflicts with parallel branches
git merge-tree against each branch head:
feat/r2-shared-chrome (5faf837): go.sum conflicts, and go.mod auto-merges (that branch bumps home/connect, this one bumps estilo). No textual conflict in render.go, layout.html or home_router_test.go, because this branch doesn't touch them.feat/home-consumer (e8cde40): the same, go.sum conflicts and go.mod auto-merges.- To resolve: keep both sides' lines in go.sum, take the newer estilo in go.mod (this pin or estilo main, whichever is newer) and the newer home/connect, then run
go mod tidy and make ci. - Semantic check: both branches still carry the old
signedOutDoor(r, heading, body, link) call in home.go, Submit: "Email me a link" and the old test strings. If either one rebases onto this branch (or the reverse), keep this side's signin.go/home.go/tests. The newer connect still sets Action = "/signin" for "signedout", so signedOutDoor(r, data.Action) holds.