🤖 Opened by Claude (Opus 5.5), agent account.
Why
The r3 polish audit (SUMMARY items 6/7) found each app saying the sign-in door's words its own way. Paul's rulings:
- 2026-10-01: the door's submit reads "Sign in", never "Email me a link".
- 2026-09-23: the hub is never named to people ("Home"); the suite is Oficina.
estilo feat/door-copy (fbd14e7, oficina/estilo #19) now owns the door's copy. This branch pins it and deletes Calls' own door strings.
What changed
- Pinned
amadan.net/oficina/estilo.git v0.0.0-20261001075355-fbd14e759027 (go.mod/go.sum only). internal/calls/auth.go: - Deleted the Heading, AddressLabel and Submit ("Email me a link") overrides from the chrome.SignIn literal. - Replaced the hand-built sent notice with chrome.SignInNotice{…}.Sent(signinPath). That drops the "Check your email" heading, "A sign in link should be on its way with a link to click." and "Use a different email address". - Set rauth.Config.Subject: chrome.EmailSubject("Calls"), so the subject is "Sign in to Calls" (it used to be rastrillo's "Your sign-in link").internal/calls/home.go: the signed-out page drawn for connect's signedout state now uses .SignedOut(home.Action). connect's "Signed out / You can sign in again with Home. / Sign in with Home" are gone. connect's Action is still the href.templates/signin.html and templates/signedout.html: the titles were the literals "Sign in", "Check your email" and "Signed out · Calls". They now come from .Door.Title / .Notice.Title, giving Sign in · Calls, Check your email · Calls and Signed out · Calls. The layout appends nothing, so these use .Title().- No Lede existed, so none was deleted. The error strings (
err=address|rate|expired) are state messages and stay.
Test red → green
These tests were added or updated before the bump: TestSigninDoorSpeaksTheSuitesCopy and TestSigninEmailSubjectNamesCalls (new), and TestHomeSignedOutIsTheOficinaDoor and TestSigninPageIsTheOficinaDoor (updated; the second's "Email me a link" assertion was dropped). harness_test.go now records the mail subject.
Red, on origin/main + the tests (make test):
--- FAIL: TestHomeSignedOutIsTheOficinaDoor
signed-out page is missing "<h1>You’re signed out</h1>"
signed-out page is missing "You’ve signed out of Calls on this device."
signed-out page is missing "<a rst-btn=\"primary\" href=\"/signin\">Sign in</a>"
signed-out page still carries "You can sign in again with Home." / "Sign in with Home" / "Home"
--- FAIL: TestSigninDoorSpeaksTheSuitesCopy
sign-in form is missing "<title>Sign in · Calls</title>"
sign-in form is missing "We’ll email you a link that signs you in. It works once and expires in 15 minutes."
sign-in form is missing "<button rst-btn=\"primary\" type=\"submit\">Sign in</button>"
sign-in form still says "Email me a link"
sent page is missing "<title>Check your email · Calls</title>"
sent page is missing "If that address can sign in here, we’ve sent it a link. It works once and expires in 15 minutes."
sent page is missing "<a href=\"/signin\">Use a different address</a>"
--- FAIL: TestSigninEmailSubjectNamesCalls
sign-in email subject "Your sign-in link", want "Sign in to Calls"
Green: GOTOOLCHAIN=go1.26.5 make ci passes (vet, gofmt, all tests, migration check), exit 0.
Local verification
I built ./cmd/calls and ran it with -env development in local sign-in mode (no Home) on 127.0.0.1:8493, then ran local-signedout.mjs:
| path | title | h1 | button | help / body | link | |---|---|---|---|---|---| | /signin | Sign in · Calls | Sign in | Sign in | We’ll email you a link that signs you in. It works once and expires in 15 minutes. | – | | /signin?sent=1 | Check your email · Calls | 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 · Calls | Sign in | Sign in | the help line, plus the "link has expired" callout | – | | /signed-out | 404 | | | Calls serves this route only with Home configured. Local sign-out goes to /signin. That page is covered by TestHomeSignedOutIsTheOficinaDoor. | |
A dev POST /signin logged subject="Sign in to Calls".
Dependency
Do not merge this before estilo feat/door-copy lands. After estilo squashes onto main, re-pin to estilo main and run go mod tidy.
Follow-ups
- Email body: Calls still sends rastrillo's default body ("Open this link to sign in: …"). rastrillo auth has no
Config.Body yet, and a rastrillo branch is drafting it. Once that lands, set Body: chrome.EmailBody("Calls"). I deliberately did not work around it here. - Out of scope (r3 item 7): on main, Calls accepts malformed addresses. This branch does not fix that. (
feat/r2-shared-chrome appears to address it in gateBegin.) docs/superpowers/copy/2026-09-08-slice-1-strings.md still lists the old sent body. It is a dated historical copy table, so I left it.
Expected conflicts
Checked with git merge-tree against origin/feat/r2-shared-chrome (6d30ba6), the local feat/r2-shared-chrome (114a90a, not yet pushed) and origin/feat/home-consumer (83a18aa).
feat/r2-shared-chrome (local 114a90a) conflicts in go.mod, go.sum, internal/calls/auth.go, internal/calls/home.go, templates/signin.html, templates/signedout.html and internal/callstest/signintest.go. homerouter_test.go merges cleanly. Resolve by keeping r2's structure and applying this branch's intent on top:
- go.mod/go.sum: take the newer estilo (
…20261001075355-fbd14e759027, or estilo main after the squash) and r2's home/connect (7a0f19c), then run go mod tidy. - auth.go
localSignin: r2's chrome.SignIn literal sets Heading, AddressLabel, Help and Submit. Delete all four, because they no longer compile against the new estilo. Keep r2's App: appName and OpenSource. In r2's sent branch, replace the hand-built notice (Heading "Check your email", its body and "Use a different address") with chrome.SignInNotice{Icon, App, Sky}.Sent(a.signinAgain(r, "")), which keeps r2's return_to-carrying again link. Use the door's .Page() as the frame part (frame{parts: []string{door.Page()}} / notice.Page()), because r2's layout appends " · Calls". - auth.go
renderSignedOut + home.go: r2 passes connect's title, body and label through renderSignedOut. Make it take only the href and build chrome.SignInNotice{…}.SignedOut(href), with frame part notice.Page() ("Signed out"). - templates signin.html/signedout.html: take r2's version, which has no
title define, and drop this branch's title lines. - callstest/signin_test.go: keep both. r2's added
type="submit">Sign in</button> and this branch's new test agree. - r2's
TestHomeSignedOutIsTheOficinaDoor edits merge cleanly. Check the merged test asserts the door's signed-out words and not connect's.
feat/home-consumer conflicts in go.mod and go.sum only (both bump different modules). Take the newer of each and run go mod tidy. render.go, layout.html and homeroutertest.go merge cleanly.