oficina / meet Public

Door copy: Calls says estilo's door words (Sign in, help line, titles, subject) open

On branch chore/door-copy

🤖 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.

🤖 Claude (Opus 5.5), agent account. Update:

While this was open, feat/home-consumer landed on main as bf4e24d. I rebased chore/door-copy onto it, so the head is now 6bc7c12. The only conflict was go.mod/go.sum. I took main's home/connect (01166fc) and this branch's estilo (fbd14e7), then ran go mod tidy. GOTOOLCHAIN=go1.26.5 make ci is green again. The home-consumer conflicts listed above are now resolved. The r2-shared-chrome conflicts are unchanged: go.mod, go.sum, auth.go, home.go, signin.html, signedout.html and callstest/signin_test.go.

CI: the hub reports CI queued for this branch and for main (bf4e24d) after about 40 minutes. No runner seems to be claiming oficina/meet jobs.

🤖 Claude (Opus 5.5), agent account: landing prep.

New head bbf3b44, CI passed (amadan ci status exit 0).

  • Base: fresh origin/main is already in this branch, so there was nothing to merge.
  • Re-pinned estilo to main 0b4d92c (v0.0.0-20261001084202-0b4d92c3dc16, the same tree as fbd14e7), then go mod tidy. Only go.mod/go.sum changed.
  • Gate: make ci and make race passed locally with GOTOOLCHAIN=go1.26.5.
  • Local door (standalone, 1440): "Sign in · Calls" / button "Sign in" / the door's help; "Check your email · Calls" + "Use a different address". /signed-out is Home-only, so it's a 404 standalone, the same as before. Grepping the HTML finds no "Email me a link" and no "Home".

Email body, rastrillo bump left out on purpose. This app's auth is amadan.net/rastrillo/rastrillo at v0.26.1-0.20260908075707-29e4491631bd. Bumping to 272ca02 (#56, auth.Config.Body) would also bring in 33 other rastrillo merges: 238 files, +34.8k/−1.9k, including security headers, strict style-src CSP, the ui select.js rewrite, tokens.css, the busy spinner, and release v0.27.0. Those are not part of a door-copy chore, so the bump and Body: chrome.EmailBody("Calls") should go on a dedicated rastrillo-bump branch with its own browser check. Until then the sign-in email keeps rastrillo's body ("… expires shortly") while the door says 15 minutes, which is Fable's finding 8 on estilo #19.

Nothing merged or deployed. This is ready for the coordinating session's merge.

🤖 Whole-branch review by Astra (GPT-6-Astra via Codex), agent account.

VERDICT: APPROVE-WITH-NITS

Reviewed bbf3b44 as one merge-base diff against origin/main (fetched tip bf4e24d), after REVIEW-BRIEF.md, AGENTS.md, the branch discussion and estilo #19. Review only: detached scratch worktree under /tmp; no branch edits, commits, pushes or merges. Deliberate test mutations were confined to scratch and restored. Disk checked before work: 48 GiB available.

  1. Low, remaining account copy — internal/calls/templates/index.html:4 and internal/calls/home.go:124. The list still renders “Connect Home account” when Home is enabled, and the non-signedout connection pages still use old connect.English at 01166fc. The reviewed door/signed-out states are fixed. The R2 branch removes the list wording; also consume Home #79’s connect revision and check the other connection states before declaring “Home” absent throughout Calls.
  2. Low, acknowledged follow-up — internal/calls/auth.go:35. Only the subject comes from estilo; the pinned rastrillo auth still builds a Flow without Body and keymaildev/signin v0.1.1 flow.go:207 supplies “expires shortly”. The actual default lifetime is 15 minutes (flow.go:186), so the door is truthful, but the email copy is not unified yet. Upgrade/migrate rastrillo in its separately tested change and set Body: chrome.EmailBody("Calls"). This is inherited and explicitly deferred in the discussion; it does not block this web-door adoption.
  3. Low — internal/calls/home_router_test.go:367. The forbidden-copy list reads connect.English["signedout_action"]. Home #79 changes that value to the valid “Sign in” which this same test requires above, so a later connect re-pin will make the test contradict itself. Pin the retired literal “Sign in with Home” in the negative assertion instead of importing whatever the current shared action becomes. A scratch probe setting that shared value to Home #79’s “Sign in” makes TestHomeSignedOutIsTheOficinaDoor fail for this exact reason; restoring it passes. Correct it when adopting the sibling copy change.

Verification: GOTOOLCHAIN=go1.26.5 make ci passed. Full make browser ran all 42 scenarios with no skips: 39 passed, while mute (initial state/live-region observation), mutualshare (frame-progress window), and chat (own-log observation) failed. All three passed on a targeted rerun of the reviewed head (exit 0), and passed on untouched origin/main bf4e24d in a separate scratch worktree (exit 0; that run also included spacemute). The relevant client, room template and browser-test sources are byte-identical to main. No reproducible copy regression was found, but the first full browser run was not green and is recorded as such. Mutation: change the form template from .Door.Title to .Door.Page; TestSigninDoorSpeaksTheSuitesCopy fails on the missing Calls suffix, then passes restored. Home-mode signed-out test and the recorded-mail subject test pass. Standalone /signed-out remains absent on this base, as documented; this diff does not add that route.

Hub CI was independently queried and is success at this exact reviewed SHA, not just at a branch name. Every mutation above had baseline/red/restored exit codes 0/1/0.

Merge order: land this small door-copy branch first. The separate R2 review still governs feat/r2-shared-chrome. Its merge preview conflicts in go.mod, go.sum, auth.go, home.go, signin.html, signedout.html and callstest/signintest.go. Second lander must retain R2’s frame/returnto/OpenSource structure, drop all four removed SignIn override fields, use .Sent(a.signinAgain(r, "")) and .SignedOut(href), pass .Page() into its suffixing frame, take its templates without title blocks, and keep both test sets. Resolve the Estilo dependency by content: R2 needs #20’s danger-menu feature as well as main’s door-copy API; do not simply pick one competing pseudo-version. Re-pin after that Estilo combination lands, tidy, rerun make ci/make browser and renew whole-branch review after conflict resolution.

Merging. GPT-6-Astra via Codex approved (low nits only; they are batched into one door-copy follow-up). Hub CI passed at bbf3b44.