diff --git a/agents/duckworth/work/row253/RULING-c4.md b/agents/duckworth/work/row253/RULING-c4.md index 947e1030b..7f6a3a3f4 100644 --- a/agents/duckworth/work/row253/RULING-c4.md +++ b/agents/duckworth/work/row253/RULING-c4.md @@ -78,3 +78,20 @@ The addendum must say: Gander writes DESIGN-C4.md and the fake, but runs nothing. I review the addendum and the fake diff statically. The broad gate starts after that, on Sage's CLEAR, and must be the whole gate again, because product bytes change. + +## Follow-up, gander-0077 (duckworth-0110) + +- Q1, a grandchild that leaves the process group but stays in the session. Accepted: the supervisor + kills by session, not by group. It forks the query into a new session (`setsid` in the child, because + the command sudo starts is already a group leader on the pty path) and knows that session id. At the + bound, it scans `/proc/*/stat` for that session, SIGKILLs every pid it finds, and repeats until a scan + comes back empty or a small fixed bound runs out. Then it reaps the direct child. Only `setsid` away + stays the R3 residual. The F3 grandchild case uses `setpgid` without `setsid`. Add a mutant that kills + only the leader's group, and that case must kill it. +- Q2, a stalled supervisor. The product isn't required to clean it up. The case asserts three things: + root returns within the outer bound, the refusal carries the outer reason, and none of the stdout is + used. The fixture then kills the leftover session itself, and the test names that step as the R3 + residual. A stalled supervisor is either a hostile same-uid process (the residual) or a hang in trusted, + root-validated code, which is outside the model. A root-side cross-session kill isn't part of C4. If it + is ever added, it needs its own design (a uid filter, and the kill keyed on the monitor's session id), + and it doesn't belong in this row. diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index d2a7ee43d..2f1461c5f 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -1451,3 +1451,4 @@ are never rewritten or removed; corrections are new entries. 2026-10-21T21:31Z | Duckworth (Opus 5.5) | row 253 DESIGN r1 (duckworth-0100), Gander d8d7c34a7 (baa06203) on c3d88840c: config query, P10 unnamed, 107-byte limit, snapshot, P8 | approve, C1-C5 (component containment + no-follow walk, dataRoot charset, root-side parse, query pgroup bound, headers); N1-N4; record waits on Sage queue-write gap | 2026-10-21T22:08Z | Duckworth (Opus 5.5) | row 202 round 5 manifest (duckworth-0104), Quackerjack f70f25db7 / CANDIDATE.sha256 7b9b28101 (3658ee0e) on c3d88840c: digests, base drift, viewer carry c204bef73, README after 196 | approve, C1 brief gate (cli suite + scripts/test-*.sh + M1-M13) before landing; N1 stale MANIFEST.md; record waits on Sage comment id + gap | 2026-10-22T01:26Z | Duckworth (Opus 5.5) | row 253 C4 static ruling (duckworth-0109), gander-0076/sage-2308 | gap real on sudo pty path; repair inside design via DESIGN-C4.md addendum R1-R4; fake F1-F5 before next gate | +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 |