Verification complete. Writing the verdict now.
Verdict: APPROVE for merge to main after CI is green and the branch discussion records this review. Activation still requires the consumer integration browser check and each consumer's gates, as stated in the request.
Reviewing model: Claude Fable 5.1 (claude-fable-5-1), read-only, 2026-09-10. Scope: dec3908b vs 672a447, source/AGENTS.md, branch.diff, all four new files under source/homeconnect/, the gate log, and rastrillo v0.23.0's ui/tokens.css in the module cache.
Evidence checked
- The diff is purely additive: four new files, no changes to theme, Makefile, CI, or go.mod. No auth, key, session, or destination-validation code is present. Package comment and README both push validation to the caller.
- Every
rst-*attribute the templates use has a styled attribute twin in the pinned rastrillov0.23.0, including the ghost variant. Nothing renders unstyled. - Back link target:
[rst-btn]computes to roughly 34px tall at the day theme's small font size, plus padding and border. Clears the 24px floor without relying on the spacing exception. - Escaping:
hrefandactionare URL contexts, sojavascript:becomes#ZgotmplZ. The test proves this and proves&becomes&in the OAuth anchor. - Gate log shows vet, build, and all four packages passing.
test-fmtis silent on success, so the log is consistent with a greenmake test. - Inline
style="overflow-wrap: anywhere"works under rastrillo's default CSP, which allows'unsafe-inline'for styles (serve.go:398).
Non-blocking findings
- Low, design. The Back link destination is hardcoded to
/inhome_link.html:7. An app mounted under a prefix or with a non-root landing page cannot correct it. Acceptable for a first extraction that mirrors current app behaviour. Per AGENTS' "second use corrects it", add aCancelHreffield when the second consumer needs one rather than now. - Low, test gap. The escaping test covers
home-connectonly.home-oauth-headputs the URL in acontentattribute, which html/template treats as plain attribute text, not a URL context, so an unsafe scheme there would not be neutralised. Design intent is that the shared security package validates first, and browsers refusejavascript:in meta refresh, so this is informational. A one-line test asserting&in the head output would document the contract. - Low, doc staleness outside this branch. AGENTS §Vocabulary still says the attribute grammar "exists in no rastrillo tree".
v0.23.0ships attribute twins for every selector. Worth a follow-up line so the next reader does not "correct" these templates back to classes. - Informational. The templates use rastrillo's vocabulary in attribute form and ship no CSS, so the
internal/lintprefix tripwire is not engaged. That is the correct row of the three-way split for markup that consumes rastrillo primitives rather than defining estilo ones.
Conditions already stated by the requester and confirmed as necessary
- Push is blocked by Amadan 503, so the branch discussion cannot yet record this review. AGENTS makes that record a merge condition, not optional.
- Consumer adoption must be reviewed separately. Parsing these definitions into an app template set that still defines the same names will conflict, so the old app definitions must go in the same consumer change.
No commands were run and no files were written, per the request.