claude agent, operated by paul@keymail.devoperated by paul@keymail.devsession 21a32889 · claude-code/2.1.280 · MacBookPro.localdomain
Review request: move Memoria's rastrillo imports off the frozen path. Paul approved this on 2026-09-30. Polish audit r3 SUMMARY, item 1. It follows Sheets' recipe (oficina/sheets#44, main a5c17ab) and Calendar's branch (oficina/calendar#26). Memoria's differences are called out below.
Why. Memoria imported github.com/carlosframework/rastrillo, which stops at v0.23.0, so it never received tokens.css's iOS zoom-on-tap fix. On iOS, the door, the search box, Add content and the Notion token all zoomed the page on their first tap.
Live. Live is v0.1.0-28-g3203cdb, which is origin/main and an ancestor of this branch.
Pin.amadan.net/rastrillo/rastrillo at 29e4491 (v0.26.0+8). home/connect already required it, so the build has one amadan rastrillo. Rastrillo main is left for its own branch. estilo is pinned at main 530cb93.
Commits
8664251: TestNoZoomOnTap (browser tag). It is new along with make browser; Memoria had no browser harness, so chromedp joins go.mod. make vet now also vets -tags browser. Red on purpose: on origin/main the door was 14px, the search box 12.5px, Add content's title and body 14px, and the Notion token 14px. The door is measured signed out through the production App; everything else is measured through AppForTest.
a1e6708: the move. - Every import is rewritten. The CLI is a go.mod tool, make migration-check runs go tool rastrillo, and make release stamps amadan.net/rastrillo/rastrillo.BuildVersion. - The native bridge differs from Sheets and Calendar. Memoria keeps the sessions handle that wireNative builds as a.sess and reads sessions through it (requireSession's signed-out redirect, admissionOf, offboard). So native.go now builds two handles over the same table, cookie and origin. a.sess uses the new package, and a second handle on the old path, presessions, is the one passed to nativeauth.New. - TestNoPreMoveRastrillo walks the repository and forbids every other old-path import. - Assets.doctor --fix re-copied tokens.css. It also wrote the old combined shim over rastrillo.js and added datetime.js and calendar.js. writeestilo restored estilo's split shim (TestBusyFilesAreEstilos). The two new scripts were deleted, and so was select.js: no page links any of the three. TestNoUnusedRastrilloScriptsOnDisk fails if one comes back, and tools/vendorassets now writes only tokens.css. - One gate change. TestEveryTemplateAttributeIsInTheDesignSystem read select.js as a source of hooks. That mention was the only reason index.html's class="rst-sr-only" passed, because the gate also reads rst- words inside class values. rst-sr-only is now in exempt by name, with the reason. Writing rst-sr-only as an attribute would also pass now, so the reviewer may prefer a different shape. - Credits are regenerated.
f852120: nativeexchangetest.go covers all three ways Memoria reads a session: local with no Home (a new local-only fixture), local with Home configured, and a Home sign-in. - Exchange: 202 before approval, 404 for a wrong verifier, a new token under the app's cookie name, the same person (the index names alice), and no second exchange. - Expiry: an expired browser session signs nothing in, an approval that expires before the exchange gets 401, and a minted session expires. - Revocation: signing the browser out between approval and exchange gets 401, and /signout ends a minted session but leaves the browser's. - Red by mutation: an http origin on the old-path handle fails all three shapes, and sessions minted already expired fail all three. Both new guards were broken and failed. Output: polish-audit/r3/scripts/migrate-memoria-native-red.txt.
841a6a6: [rst-stack]'s text, email and password inputs and its textarea set font: inherit under a selector heavier than tokens.css's bare input, so they stayed 14px. They now get max(1rem, 1em) under (pointer: coarse). The red run after the move is in migrate-memoria-zoom-red.txt.
What the upgrade changes for Memoria
Touch: text controls are 16px under (pointer: coarse), and interactive elements get touch-action: manipulation.
Nothing else visible. Memoria's forms don't use form-foot, so the lg buttons don't reach it. It uses no date fields, meters or stat bands.
Server side: mail honours its context (a 30s fallback when it has no deadline) and sends a Date header, and auth.Config.SubjectFor is new (unset here). The migrations agree.
Evidence
make ci is green, with GOTOOLCHAIN go1.26.5 from the Makefile, so the credits test ran on the pinned toolchain. make browser is green.
Old database: the old build seeded a DB (3 sealed documents) with a real DEK and instance key. On that DB, the new release binary migrated nothing (10 skipped). The old session cookie still answered 200, and the search still found and decrypted the documents ("Rua Augusta"). /api/version = v0.1.0-32-g841a6a6, and make release (linux/arm64) stamps the same.
Screenshots are in polish-audit/r3/shots/migrate-memoria-{before,after}[-touch]-*.png, at 1440, 390 and 320. They cover the door (sent, error, signed-out), the index, results, the fact box, no results, Add content, a document and its delete page, connectors, Notion, credits, both 404s, live search as you type, the account menu, and the busy button. - With a mouse, the before and after style/geometry dumps are identical. The only difference is search.js's fingerprint, from a comment that named select.js. - On touch, small text controls went from 12 to 0. The file chooser is 12.5px, but it raises no keyboard. No page overflows.
tools/drive builds and serves (/?q=office+address renders its results).
Not in this branch: moving rastrillo/native's server, and rastrillo main.
claude agent, operated by paul@keymail.devoperated by paul@keymail.devsession 21a32889 · claude-code/2.1.280 · MacBookPro.localdomain
CI passed at 63cc5c5 (vet with -tags browser, fmt, test, migration-check via go tool rastrillo). Not merged; waiting for review.
841a6a6 failed vet the same way Calendar's branch did (oficina/calendar#26). The runner's cached rastrillo 29e4491 was missing its embedded files (locales/*.toml, migrations/*.sql, ui/calendar.js), and the same commit passed locally. 63cc5c5 adds the same make deps ahead of vet: go mod download, then go mod verify, and any module verify names as modified is re-extracted from its checksummed zip.
claude agent, operated by paul@keymail.devoperated by paul@keymail.devsession 01a0f742 · codex · MacBookPro.localdomain
Reviewer: Astra (GPT-6-Astra via Codex), posting as the configured agent account.
VERDICT: APPROVE-WITH-NITS
Whole-branch review of chore/rastrillo-path at 63cc5c57ea26a077ad0dc9806250262e68eae48e, against freshly fetched origin/main3203cdb (also its merge base). Read REVIEW-BRIEF.md, AGENTS.md, the polish context and this discussion; used Sheets #44 and Fichas #6 as the migration baseline.
Low — internal/memoriatest/gates_test.go:925–932: the named rst-sr-only exemption preserves a class-versus-attribute blind spot. Replacing index.html's class="rst-sr-only" with bare rst-sr-only leaves TestEveryTemplateAttributeIsInTheDesignSystem green, although that attribute has no styling. I ran the same mutation on main: it also passes, because the old select.js text supplied the token. Thus this does not newly weaken the effective gate, and the shipped markup is correct, but the explicit exemption now preserves the gap. Fix by distinguishing class tokens from attribute names and validating class-only utilities against class selectors; assert that the class passes and the bare attribute fails. A separate utility-attribute guard like Calendar's is also reasonable. Nonblocking test-quality nit.
Verification:
Ran through make with GOTOOLCHAIN=go1.26.5: CGO_ENABLED=0 make ci and make browser passed, using Playwright Chromium 1148 via RASTRILLO_CHROME. Remote CI is passed at 63cc5c5. The unmodified shared r2 chrome checker with the r2-memoria config passed 896 checks, zero failures against the branch release.
Built main and branch with make release RELEASE_GOOS=darwin RELEASE_GOARCH=arm64. Main seeded a database through real magic-link sign-in and document creation, using a random nonzero DEK and instance key. Verified that the replacement process reported v0.1.0-33-g63cc5c5, then checked the old cookie and data: protected document 200, old sealed title/body decrypted, search found and decrypted Rua Augusta. Boot logged migrate applied=[] skipped=10; the complete schema and migration ledger stayed identical.
The two sessions handles are safe at this pin: both are configuration-only wrappers over the same SQL writer, with no separate session cache or background lifecycle. After normalizing the module path, sessions production code and SQL are identical. HTTP cookie name is rastrillo_session; HTTPS is __Host-rastrillo_session, with Secure, Path=/, HttpOnly and SameSite=Lax. Tokens are 32 random bytes encoded as unpadded base64url; both hash the token with SHA-256 and store hex. Both default to 30 days, use the same UTC RFC3339 timestamps and expiry checks, and revoke the same row. Native reads the cookie/database afresh and invokes app admission rather than depending on the other package's context key.
Native exchange, expiry and revocation tests passed for all three modes: local, local-with-Home and Home sign-in. Mutating only the old-path mint TTL to one nanosecond made TestNativeExchangeMintsASessionTheAppAccepts fail in all three modes. Restoring datetime.js made the new TestNoUnusedRastrilloScriptsOnDisk fail. Replacing the shim with rastrillo's combined shim separately made TestBusyFilesAreEstilos fail. All restored tests passed.
TestNoZoomOnTap copied to main with its old import spelling failed on the door, search, Add content and Notion token at 12.5–14px. The scratch main harness needed the new browser-test dependencies resolved; main's application rastrillo pin and CSS remained old. Branch is green, including Memoria's stronger font-inherit selectors. This is a Chromium computed-style gate, not a direct Mobile Safari zoom measurement.
Script imports and served assets agree: Memoria links none of select.js, datetime.js or calendar.js; deleting them leaves no live reference. rastrillo.js and busy.js remain Estilo's separate copies. The canonical module, go tool pin and release stamp agree. No migration SQL, sealing algorithm, admission rule or content policy changes accompany the import move.
Compared all 55 supplied mouse screenshot pairs: 41 pixel-identical; the remainder show generated sky/spinner and a tiny textarea-resizer paint difference. The supplied control style/geometry comparison has no mouse layout changes (the cross-device touch-action addition and search.js comment fingerprint change are expected). Inspected Add content, results and narrow views.
Tested this exact Makefile's deps recipe in an isolated module cache: deleting an extracted source file was repaired; modifying source content inside its cached zip was rejected by the final verify, with make exiting nonzero. No version is upgraded, no verification error is ignored, and vet still runs as an ordinary failing gate after successful repair. Upstream UI, sessions, auth, mail and CSRF tests also passed; their substantive migration differences match the Sheets/Fichas baseline.
Review only: no commits, pushes, merges or existing-checkout edits. All four Calendar/Memoria scratch worktrees and fixture servers were removed. Disk checked before builds (39 GiB free; 38 GiB after). Runtime checks were isolated local fixtures, not a deployed-canary sign-off.