oficina / slides Public

Door copy: take the sign-in door's words from estilo (submit reads Sign in) open

On branch chore/door-copy

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

Why

polish-audit r3 SUMMARY items 6/7: the door's copy drifted per app, and Slides' submit read "Email me a link". Paul's rulings: 2026-10-01 the submit reads "Sign in"; 2026-09-23 the hub is never named, it is "your Oficina account". estilo feat/door-copy (fbd14e7, oficina/estilo #19) now owns the whole door copy set (chrome.English), and an app override no longer compiles.

What changed (commit 2b54a2f)

  • go.mod: estilo pinned to v0.0.0-20261001075355-fbd14e759027 (fbd14e7), go mod tidy.
  • internal/slides/auth.go - Form: chrome.SignIn loses Heading/AddressLabel/Help/Submit; title part is form.Page() (layout appends " ¡ Slides"). - Sent: chrome.SignInNotice{…}.Sent(again). The existing again logic is kept: /signin or /signin/local in Home mode, plus the remembered return_to. - Signed out: chrome.SignInNotice{…}.SignedOut("/signin"), title part notice.Page(). This page is also what connect's "signedout" state renders (home.go renderHome already delegates to renderSignedOut), so Home mode shows the door's copy, not connect's "Sign in with Home". The href /signin is the same as connect's Action for that state. - rauth.Config.Subject = chrome.EmailSubject("Slides"), which gives "Sign in to Slides" (it was rastrillo's default "Your sign-in link").
  • Deleted from locales/en.toml: slides.signin.title, .address.label, .help, .submit ("Email me a link"), .sent.title, .sent, .again; slides.signedout.title/.heading/.body; slides.home.signedout_title/_body/_action (unused, because renderHome never asks connect for that state). Kept: slides.signin.error.* and slides.chrome.signin (the bar's Sign in link). No Lede was set, so none was deleted.

Test red → green

New internal/slidestest/signin_door_test.go TestDoorCopyIsEstilos checks the help line, ">Sign in</button>", no "Email me a link" and no "Home", the sent body, ">Use a different address</a>", "You’re signed out", the body, and the three tab titles. home_test.go now matches the retry link by "Use a different address" and checks that the Home-mode /signed-out is the door's page.

Before the change (old estilo, old code):

--- FAIL: TestDoorCopyIsEstilos (0.21s)
    signin_door_test.go:76: GET /signin lacks ">Sign in</button>"
    signin_door_test.go:81: GET /signin says "Email me a link"
FAIL

After: ok amadan.net/oficina/slides/internal/slidestest. Full make ci (vet, fmt-check, test, migration-check, credits-check) passes.

Local verification (run-dev.sh, local sign-in, port 8461, local-signedout.mjs)

| path | title | h1 | button | help / body | links | |---|---|---|---|---|---| | /signin | Sign in · Slides | 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 · Slides | 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 · Slides | Sign in | Sign in | the expired error, then the help line | Open source | | /signed-out | Signed out · Slides | You’re signed out | none | You’ve signed out of Slides on this device. | Sign in |

Home-mode /signed-out is covered by the unit test, not a live run.

Dependency

Must not merge before estilo feat/door-copy lands. After estilo's squash, re-pin to estilo main (go get amadan.net/oficina/estilo.git@main && go mod tidy).

Follow-up

The sign-in email body is still rastrillo's default. rastrillo/auth can't set it yet; a rastrillo branch is drafting Config.Body. When it lands, set Body: chrome.EmailBody("Slides"). This branch has no workaround.

Expected conflicts

  • origin/feat/r2-shared-chrome (14 ahead, 2026-09-24): touches internal/slides/auth.go (the same chrome.SignIn/SignInNotice literals, with Heading/Submit/…), locales/en.toml (the same keys), home.go, home_test.go, and go.mod/go.sum. Most of its content looks already on main through signin-door, but its commits are not patch-equal. Resolve auth.go/en.toml by taking this branch's side (door copy from estilo, keys deleted). An override field won't compile against the new estilo anyway. home_test.go: keep the "Use a different address" regex.
  • origin/wip/r2-slides-editor, origin/feat/estilo-theme, origin/feat/estilo-save-status: go.mod/go.sum only.
  • go.mod/go.sum everywhere: take the newer estilo, then re-run go mod tidy.

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

New head 49cf6fb, 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: the Go section of .amadan/ci.d/10-gate (make ci, which includes the credits check) passed locally with GOTOOLCHAIN=go1.26.5. The Rust and wasm steps can't be checked on this machine: Homebrew's rustc 1.92 shadows the pinned 1.98, so the wasm byte-compare fails here whatever the branch contains. This branch touches no Rust or wasm. Hub CI runs the whole gate.
  • Local door (standalone, 1440): "Sign in ¡ Slides" / "Sign in" / the door's help / Open source; "Check your email ¡ Slides" + "Use a different address"; "Signed out ¡ Slides", "You’re signed out", "You’ve signed out of Slides on this device.", Sign in. 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("Slides") 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 49cf6fb as one merge-base diff against origin/main (fetched tip c722306), 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, acknowledged follow-up — internal/slides/auth.go:281. 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("Slides"). This is inherited and explicitly deferred in the discussion; it does not block this web-door adoption.
  2. Low, remaining connection copy — internal/slides/locales/en.toml:595. slides.home.start_action = "Continue" survives. Adopt the shared “Connect” wording on this account-connection screen when consuming Home #79; do not confuse this with the corrected email-form submit.

Verification: GOTOOLCHAIN=go1.26.5 make ci passed, including credits. Attempted the full .amadan/ci.d/10-gate: local wasm byte-compare fails (1,229,204 generated bytes versus 1,228,229 in hub CI), including a retry with the pinned rustup 1.98.0 explicitly first on PATH. The core source, build script, lock/toolchain and committed artifact are unchanged versus main; this is a local reproducibility limitation, not a door regression. Exact-head hub full gate passed. Local local-signedout.mjs: all four routes 200, correct copy/titles at 1440 and 390; phone screenshot inspected. Mutation: change .Sent(again) to .Sent("/signin"); TestHomeDifferentAddressStaysInLocalRecovery fails on the lost /signin/local?return_to=... link, then passes restored.

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 49cf6fb.