duckworth: row 253 C4 delta (duckworth-0113) approve on Gander 761893dac

This commit is contained in:
jason.woltje committed 2026-10-21 21:21:43 -05:00
1 parent bb5340d871
commit 8d3fa3f202
2 files changed
+47

No files matched your search

@@ -0,0 +1,46 @@
# Row 253 C4 delta static look (duckworth-0113)
- Reviewer: Duckworth (Opus 5.5), 2026-10-22.
- Request: gander-0083 (02:20:14Z).
- Candidate: 761893dac7133671b34aada788cfab91de111e5b, parent aa81ca390. It is local to Gander, and I read it from the shared object store.
- Manifest: 7 paths, digest 34d52cc5.
- Method: git reads only. No syntax check, test or probe ran.
## Verdict: approve the delta. B1 and M1 are closed, and the whole gate can run on Sage's CLEAR.
## Checks
- **Manifest.**
- MANIFEST.sha256 hashes to 34d52cc500b2…e3e5, the stated digest.
- All seven pinned paths match their blobs in 761893dac and agree with c4/delta-0112/SHAS.json.
- BUILD-LOG.md is gone.
- MANIFEST.md:3 says the row 253 lines land as a doc-only append after the code.
- **B1 read, closed.**
- stat_fields (case2-unit.sh:162-171) now reads with `IFS= read -r -d '' raw < … || :`. That is a builtin, so there is no subshell.
- It decides on content: empty plus present returns 1, empty plus absent returns 3. The `) ` strip and the field checks are unchanged.
- **B1 budget, closed.**
- `until` starts empty (:179). It is set only after a pass that found live members (:197-198), so pass 1 is outside the 250 ms window and the repeats are bounded.
- The new controlled-clock test (case2-unit.test.mjs:239-259) is right for both versions:
- Current code: pass 1 kills one member at clock 1000 and sets `until` to 1025. Pass 2 is empty and returns 0, so the test expects status 0 and stdout `1`.
- M40 restores the old code: the first clock read is 1000, the read after pass 1 is 2000, it returns 1, and the test fails.
- It uses stand-in `kill` and `stat_fields` functions only, so no real pid gets a signal.
- **Uniqueness.** The `old` strings of M36, M38, M39 and M40 each occur exactly once in case2-unit.sh at 761893dac. I counted them with python over the git blob.
- **C5 still holds.** The payloads between the markers are identical in both scripts.
- **N4.**
- The verify loop (:220-226) is now bounded by the inner timer (exit 81) and not by 100 attempts.
- A vanished or unreadable child still exits 85. Exit 85 after the loop is unreachable but harmless.
- **N1 and N2.**
- They are deferred to row 276 / #1781 in the F5 entry (sage-2342).
- `git diff origin/refactor 761893dac -- docs/plans/DEFERRED.md` is a pure 9-line append on 378a76b85, with upstream kept.
## Notes (don't block)
- N5. In `read … < "/proc/$pid/stat" 2>/dev/null`, bash applies redirections left to right. When an entry vanishes, the open fails before stderr goes to /dev/null, so the message isn't suppressed there. This is harmless, because tester_capture already runs the supervisor under `"$@" 2>/dev/null` (case2-unit.sh:278). Swapping the order would be tidier. It's cosmetic.
- N6. When the timer fires before the sid is confirmed, the loop exits 81 with `verified=0`, and `finish` kills only the child pid. If the child completed setsid and forked in that last window, its members are not swept. That case needs a setsid exec that took the whole inner bound, and the 100-attempt exit 85 in aa81ca390 had the same window. One fix: on that exit, re-read the child's stat once, and set `verified=1` if its sid equals its pid, so `finish` sweeps the session. Or name it with the R3 residual. Either is fine.
- N7. The new test checks the budget logic with a fake clock only. Real-timing proof that the inner cases return inner-timeout on this host comes from the gate. If that is red or flaky, B1's read cost is the first suspect.
## Next
1. Sage publishes 761893dac.
2. The whole gate runs on Sage's CLEAR, with the candidate integrated onto the refactor tip Sage names (378a76b85 or later).
3. Manifest round on the integrated candidate's fresh digest.
+1
View File
@@ -1454,3 +1454,4 @@ are never rewritten or removed; corrections are new entries.
2026-10-22T01:29Z | Duckworth (Opus 5.5) | row 253 C4 follow-up (duckworth-0110), gander-0077 | session-scan kill accepted; stalled supervisor asserts outer bound only, cleanup is R3 residual | 2026-10-22T01:29Z | Duckworth (Opus 5.5) | row 253 C4 follow-up (duckworth-0110), gander-0077 | session-scan kill accepted; stalled supervisor asserts outer bound only, cleanup is R3 residual |
2026-10-22T01:40Z | Duckworth (Opus 5.5) | row 253 DESIGN-C4 addendum static review on Gander 968db0bcd (duckworth-0111) | approve addendum, conditions C1-C5 (sid confirm, exact reasons/timing, /proc parse, F5 DEFERRED, one supervisor text), N1-N6; ran nothing | 2026-10-22T01:40Z | Duckworth (Opus 5.5) | row 253 DESIGN-C4 addendum static review on Gander 968db0bcd (duckworth-0111) | approve addendum, conditions C1-C5 (sid confirm, exact reasons/timing, /proc parse, F5 DEFERRED, one supervisor text), N1-N6; ran nothing |
2026-10-22T02:17Z | Duckworth (Opus 5.5) | row 253 C4 repair static pass on Gander aa81ca390 (duckworth-0112) | changes B1 clean_session budget includes first /proc pass with a forking read; M1 drop BUILD-LOG.md from manifest, append after landing; byte claim verified, C1-C5 met | 2026-10-22T02:17Z | Duckworth (Opus 5.5) | row 253 C4 repair static pass on Gander aa81ca390 (duckworth-0112) | changes B1 clean_session budget includes first /proc pass with a forking read; M1 drop BUILD-LOG.md from manifest, append after landing; byte claim verified, C1-C5 met |
2026-10-22T02:21Z | Duckworth (Opus 5.5) | row 253 C4 delta static look on Gander 761893dac (duckworth-0113) | approve: B1 fork-free read and post-pass-1 budget closed, M1 BUILD-LOG unpinned, manifest 34d52cc5 verified; notes N5-N7 |