Review record: estilo.json; model claude-fable-5-1; session 44684b65-6ef2-47f7-949a-6307c83e19a0
REQUEST CHANGES. Reviewed by Claude Fable 5.1, read only. The primitive is the right shape and the right home, but the spec misdescribes the second consumer and leaves three integration mechanics undefined that would change the Docs behaviour it promises to preserve.
Note on inputs: both fixtures/editor-entry.js files live at each worktree root, not under internal/…. I reviewed those.
What is correct
- Escaped template strings,
textContentonly, no copy in Estilo, closed state set with silent unknowns, app-owned sticky failure. All match how both apps already behave. estilo-*attributes satisfyinternal/lint/prefix_test.go. Note AGENTS.md's Vocabulary example still showsrst-inspectorfor an estilo component, which contradicts the lint. Not this spec's fault, but worth a one-line fix there.- Docs-first, Slides-second matches the one rule. The dependency ruling is no longer a blocker since go.mod pins rastrillo v0.22.0.
Issues
- The Slides consumer description is wrong. The spec says Slides shows saved, saving, retrying and failed. The actual states in
editor-entry.jsaresaved,saving,offline,error. Slides has no failed string. Its sticky dropped-batch case shows the offline text, anderroris a slide-load failure, not a save state. The spec must state the mapping explicitly. Recommendation:offlinemaps to Retrying with its existing "Offline, retrying" string, sticky failure stays on that same string for this migration, and the load error stays an app-owned element outside the shared component. That keeps the closed set honest and introduces no new copy. If the adopter wants a real Slides "failed" message, that is new product copy and needs human review, so keep it out of the overnight run.
- "Visually silent" plus floating placement will break announcements unless specified. Docs today uses
display: noneon the container and toggles it on. The spec moves to updating text in an always-present live region, which is better, but if the floating variant also hides viadisplay: nonewhen text is empty, the region leaves the accessibility tree and the first failure message is added in the same tick the region reappears. Many screen readers drop that. Specify that the silent state removes padding, background and shadow while keeping the element rendered, for example an:emptyrule, and add a DOM test that the region exists in the tree before text changes.
- The JavaScript delivery path is undefined. Both apps build their editor bundle from
fixtures/, but the shared function lives in a Go module. "Served through the existing embedded asset route" says where the file is served, not how the bundle calls it. State one mechanism: an ES module served at an asset URL and imported by URL from the app bundle, or a tiny function the app bundle receives via the served module's global. Also state where the state texts live client-side. Slides already usesdata-text-*attributes on the root, which is the right pattern and keeps copy out of the bundle.
- Print behaviour is lost on Docs. The Docs print stylesheet hides
[docs-save-status]at line 510 by app selector. Integration says to remove app-local status styling, which would print the floating pill. Either the floating variant ships its own@media printhide, or the spec names the print rule as one of the retained app selectors.
- Inline variant needs reserved width. Slides sets
min-width: 8chso the header bar does not jitter between "Saved" and "Saving…". Add that requirement to the inline placement or the Slides header will shift on every keystroke.
- Failed tone for Docs is under-specified. Docs' failed state uses the negative tone tokens plus weight. The spec says "words plus weight" only. Using existing
--rst-tone-negative-*tokens is not a theme change and is the one state a person must not miss. State that the floating variant keeps the negative tone for failed and that colour is never the sole carrier. Otherwise the Docs migration is a visible regression in urgency, which contradicts "do not change failure" intent.
- Pin the Slides revision. Docs is pinned at 499d200. Slides is described as "active slice-2-editor" while the tree reviewed is the slice-1 worktree, whose AGENTS.md still says no browser editor exists. Name the commit the adoption branches from, as the spec already does for Docs.
Verification additions
- A test that the Slides sticky-failure path never shows "Saved" after a dropped batch, mirroring the Docs test already required.
- A test that a state with no text yields an empty region that is still present in the DOM and accessibility tree.
- 320px check on the floating variant with Docs' longest failed string in the widest locale available.
Scope and copy
No new localized strings are needed if issue 1 is resolved as recommended. All four Slides strings and both Docs strings already exist in their catalogs and pass through unchanged. Any deviation from that is a copy change and must go to human review before merge.
Review record: estilo-r2.json; model claude-fable-5-1; session 44684b65-6ef2-47f7-949a-6307c83e19a0
APPROVE, reviewed by Claude Fable 5.1, read only. All seven prior findings are resolved in the spec as written. Two minor items to carry into implementation, neither blocking the spec.
Resolved
- Slides mapping is now exact and matches
editor-entry.js: saved and saving direct, offline to retrying with its existing text, sticky dropped batch stays on offline text, load error stays app-owned. No new copy is introduced. - Silent state keeps the live region rendered and in the accessibility tree. Floating silence strips padding, background and shadow only.
- Delivery is a same-origin ES module by URL, external to bundling, with texts on the element as escaped data attributes and a stated module-load failure path. That is consistent with the "no CDN, no bundler" rule.
- Print hiding, inline 8ch width, Docs' negative tone tokens for failed, and pinned Slides revision are all present.
Carry into implementation
- Floating variant must keep
pointer-events: none. Docs' current fixed notice has it atshow.html:1274so the pill never intercepts clicks on the page beneath. The spec says "non-interactive" but does not name this. Add it to the floating CSS or the migration regresses click-through on Docs.
- Review record location. The spec cites a
/tmpJSON file as review 1's record. Estilo's AGENTS.md requires the reviewing model to be recorded in the branch discussion, since/tmpdoes not survive. Post both reviews to the branch discussion before merge.
Not verified
I could not confirm that a863fb6 exists in the Slides repo or that 499d200 matches the Docs tree I inspected. No shell was available. The implementation reviewer should check both pins against the actual adoption branches.