oficina / memoria Public

Door copy: take the sign-in door's words from estilo open

On branch chore/door-copy

🤖 Opened by Claude (Opus 5.5), agent account.

Why

Polish audit r3 SUMMARY items 6/7: every app's door carried its own copy, and Memoria's still said "Email me a link" under a marketing lede. Paul's rulings: the submit reads "Sign in", never "Email me a link" (2026-10-01); Oficina is the suite and the hub is never named to people (2026-09-23). estilo feat/door-copy (fbd14e7, oficina/estilo #19) now owns the door's words (chrome.English); this branch pins it and deletes Memoria's overrides.

What changed (9 files, +48/-36)

  • go.mod/go.sum: estilo → v0.0.0-20261001075355-fbd14e759027 (fbd14e7). Vendored chrome/sky assets regenerated with go run ./scripts/writeestilo: no change.
  • handlers.go localSignin: the chrome.SignIn literal keeps only Icon/App/Sky/Action (+Hidden/Error). The sent state is chrome.SignInNotice{…}.Sent(back), where back is the existing form path (kept ?force=1).
  • home_render.go: connect's signedout state is now chrome.SignInNotice{…}.SignedOut(data.Action). These are the door's words, with connect's Action as the href. Connect's "Signed out / You can sign in again with Home / Sign in with Home" is gone.
  • templates/signin.html: the title define uses .Sent.Title / .SignedOut.Title / .Door.Title. layout.html and render.go are untouched.
  • auth.go: Subject: chrome.EmailSubject("Memoria") → "Sign in to Memoria".

Deleted (app-owned strings the door now owns)

  • signinLede const "Memoria holds your team's work in one place. Sign in with your email and we'll send you a link." (marketing copy; local mode has no lede)
  • door overrides Heading: "Sign in", AddressLabel: "Email address", Submit: "Email me a link"
  • sent Heading: "Check your email", Body: "We've sent you a link to sign in.", link "Back to sign in"
  • signinOutcome's sent sentence "Check your email. We've sent you a link to sign in." (it now returns "", "good", and the door says it)
  • title literals Sign in — Memoria and {{.Heading}} · Memoria
  • email subject "Your memoria sign-in link"

Kept

  • One Lede, ?reauth=1 → "Sign in again to continue." It is a state message (why the form is back), not an introduction, and it doesn't contradict the door.
  • The ?err= sentences (door Error): state, not door copy.
  • auth.go renderOAuth (the Keymail continuation notice) keeps its own copy. It isn't a door state.

Tests: red → green

Updated, none deleted: memoriatest/signin_door_test.go (title, >Sign in</button>, help line, and absence of "Email me a link" / "holds your team" / "Sign in — Memoria"), memoriatest/signinoutcome_test.go (sent body, "Check your email · Memoria", <a href="/signin">Use a different address</a>), memoria/home_router_test.go TestSignedOutIsTheDoor ("Signed out · Memoria", "You’re signed out", "You’ve signed out of Memoria on this device.", href=…>Sign in</a>, and no "Home" anywhere on the page).

Before the bump (make test):

--- FAIL: TestSignedOutIsTheDoor
    home_router_test.go:399: /signed-out lacks "<h1>You’re signed out</h1>"
    home_router_test.go:399: /signed-out lacks "You’ve signed out of Memoria on this device."
    home_router_test.go:399: /signed-out lacks "href=\"/signin\">Sign in</a>"
    home_router_test.go:404: /signed-out names Home:
--- FAIL: TestSigninPageIsTheDoor
    signin_door_test.go:54: the sign-in page lacks "<title>Sign in · Memoria</title>"
    signin_door_test.go:54: the sign-in page lacks ">Sign in</button>"
    signin_door_test.go:54: the sign-in page lacks "We’ll email you a link that signs you in. It works once and expires in 15 minutes."
    signin_door_test.go:61: the sign-in page still says "Email me a link"
    signin_door_test.go:61: the sign-in page still says "holds your team"
    signin_door_test.go:61: the sign-in page still says "Sign in — Memoria"
--- FAIL: TestSigninPageSaysWhatHappened
    signinoutcome_test.go:80: the sent page is not the door's check-your-email notice:
    signinoutcome_test.go:86: the sent page's tab title is not "Check your email · Memoria"
    signinoutcome_test.go:89: the sent notice does not link back to the form as "Use a different address":

After: all three pass, and memoriatest and the rest of make ci are green. The one exception is locally: TestAModelResponseIsCheapToProcess/a_row_whose_processing_crosses_the_deadline_is_dropped failed 3/3 with "search took 7–9s … no row with time to spare". That is a wall-clock deadline test, and the machine's load average was 230–265 (other sessions). It has nothing to do with the door. Hub CI is the clean run.

Local verification (standalone, no Home; local-signedout.mjs, 1440px)

| path | title | h1 | button | help / body | links | |---|---|---|---|---|---| | /signin | Sign in · Memoria | Sign in | Sign in | We’ll email you a link that signs you in. It works once and expires in 15 minutes. | (none) | | /signin?sent=1 | Check your email · Memoria | Check your email | (none) | 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?err=expired | Sign in · Memoria | Sign in | Sign in | error callout + help | (none) | | /signin?reauth=1 | Sign in · Memoria | Sign in | Sign in | lede "Sign in again to continue." + help | (none) | | /signed-out | 404, as on main: Home-only in this branch's base | | | | |

The Home-configured /signed-out is covered by TestSignedOutIsTheDoor above. A local POST logged the mail with subject="Sign in to Memoria".

Dependency

Must not merge before estilo feat/door-copy lands. Re-pin to estilo main after its squash.

Follow-up: email body

The body is still rastrillo's ("Open this link to sign in: …"). rastrillo auth can't set it yet. A rastrillo branch is drafting Config.Body, and once it lands Memoria sets Body: chrome.EmailBody("Memoria"). No workaround here.

Expected conflicts

feat/r2-shared-chrome (917e2b6, still being worked) conflicts in 8 files: go.mod, go.sum, internal/memoria/auth.go, internal/memoria/handlers.go, internal/memoria/home_render.go, internal/memoria/home_router_test.go, internal/memoria/templates/signin.html, internal/memoriatest/signin_door_test.go. (signinoutcome_test.go auto-merges.) r2 already moves toward the same words, but it writes them as app constants against the old estilo. Against fbd14e7, r2's Heading/AddressLabel/Help/Submit fields fail to compile. Resolution:

  • go.mod/go.sum: take the newer estilo (fbd14e7, or estilo main once it lands), then go mod tidy.
  • auth.go: take r2's landedPath and this branch's Subject: chrome.EmailSubject("Memoria").
  • handlers.go: keep r2's structure (return-to, again path, frames, OpenSource). Drop its signinHelp/signinSentBody constants and the Heading/AddressLabel/Help/Submit fields. Build the sent state as chrome.SignInNotice{Icon, App: appName, Sky}.Sent(again).
  • home_render.go: take r2's version (delegates to a.signedOut). In r2's return.go signedOut, use chrome.SignInNotice{…}.SignedOut(signinPath) instead of the literal heading/body/link. r2's homeCopy["signedout_body"/"signedout_action"] overrides then become dead, so delete them.
  • templates/signin.html: take r2's (its title comes from the layout frame). Check that r2's frame renders exactly Sign in · Memoria, Check your email · Memoria, Signed out · Memoria. If the layout appends · Memoria, pass .Page().
  • signin_door_test.go, home_router_test.go: union the assertions. Keep r2's footer/open-source checks plus this branch's title and "no Home" checks.

feat/home-consumer (6030871) conflicts only in go.mod/go.sum: take the newer estilo and go mod tidy. handlers.go and home_router_test.go auto-merge.

This branch doesn't touch layout.html, render.go or home.go.

Nothing is merged or deployed.

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

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

  • Merged origin/main 0cc9d09 (the shared chrome). The eight-file conflict predicted above came up and was resolved per the plan: - go.mod/go.sum: main's newer home/connect, estilo re-pinned to main 0b4d92c (same tree as fbd14e7), then go mod tidy. - auth.go: main's file, including its landing/return work, with Subject: chrome.EmailSubject("Memoria"). - handlers.go: main's localSignin (return-to, again, frames, Open source). Its signinHelp/signinSentBody constants and the door's Heading/AddressLabel/Help/Submit fields are deleted. The sent state is chrome.SignInNotice{…}.Sent(again), framed by sent.Page(). In signinOutcome, the sent case returns "", "good". - return.go signedOut: chrome.SignInNotice{…}.SignedOut(signinPath), framed by out.Page(). - home_render.go: main's version (delegates to a.signedOut). homeCopy["signedout_body"/"signedout_action"] were dead after that and are deleted. - templates/signin.html: main's. The frame renders "Sign in · Memoria", "Check your email · Memoria" and "Signed out · Memoria" (checked locally). - signin_door_test.go, home_router_test.go: unioned. Main's open-source and no-footer checks are kept, plus the branch's title, <h1>You’re signed out</h1> and no-Home.
  • Gate: make ci passed locally with GOTOOLCHAIN=go1.26.5. My first resolution took the branch's whole auth.go, which lost main's landing change. TestASignedOutDeepLinkComesBackAfterSignIn caught it, and the fix is folded into the merge.
  • Local door (standalone, 1440): /signin "Sign in · Memoria", button "Sign in", the door's help, Open source; ?sent=1 "Check your email · Memoria" with "Use a different address"; /signed-out (main now serves it standalone) "Signed out · Memoria", "You’re signed out", "You’ve signed out of Memoria on this device." Grepping the HTML finds no "Email me a link" and no "Home".

Email body: this app's auth still comes from the frozen github.com/carlosframework/rastrillo path, which has no auth.Config.Body. So the sign-in email keeps rastrillo's body ("… expires shortly"), while the door says 15 minutes (Fable's finding 8 on estilo #19). That gets fixed when the app migrates to amadan.net/rastrillo and sets Body: chrome.EmailBody(App). It isn't a bug in this branch.

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 bd46690 as one merge-base diff against origin/main (fetched tip 0cc9d09), 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 — internal/memoria/handlers.go:1279. The form frame still hardcodes []string{"Sign in"}. The sent and signed-out frames correctly use their .Page() methods, but this last literal leaves the form tab outside estilo’s copy set and can diverge on a future copy/locale change. Use []string{door.Page()} here.
  2. Low, acknowledged follow-up — internal/memoria/auth.go:219. 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("Memoria"). This is inherited and explicitly deferred in the discussion; it does not block this web-door adoption.
  3. Low, remaining connection copy — internal/memoria/home_render.go:47. The local start_action = "Continue" override masks Home #79’s shared “Connect” wording. Remove it on the connect-module adoption; the email form itself correctly says “Sign in”.

Verification: GOTOOLCHAIN=go1.26.5 make ci passed. Reviewed all eight conflict resolutions with --remerge-diff and compared the final branch to main. Main’s /auth/landed, return cookie, Home delegation, frame, Open source and no-footer behavior remain. TestASignedOutDeepLinkComesBackAfterSignIn passed; mutation landing := landedPath → landing := "/" makes it fail on / versus /documents/7?x=1, then it passes restored. TestHomeLocalRetryKeepsTheReturnFromEitherEntry also passed, covering sent → different-address with return_to from both Home local entry paths.

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.

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