diff --git a/docs/active-work.md b/docs/active-work.md index 2f542bc..581b6dc 100644 --- a/docs/active-work.md +++ b/docs/active-work.md @@ -341,6 +341,15 @@ from #171 and #215. id**; they are not duplicated here, because a docs commit answering a review moves both, and a ledger line naming them is stale the moment it is written — the lesson §5b learned twice. +- **Review follow-up found U13, separately recorded.** On signed head + `756c2b8`, gate `20260829T171606Z-1087848` was 7/8: `07-sweep` + reddened only + `gate_script_acceptance::skipped_directories_are_reported_with_a_reason`. + The child command's stdout was empty, but the row discards its stderr + and status, so the mechanism is unrecoverable. The exact selector and + the full 36-test binary both passed immediately afterwards — + intermittence only. This lane changes neither the gate script nor + that acceptance binary; diagnostic hardening is a separate lane. - **Still owed, separately:** `workflow_dispatch` on `ci.yml`, and U9's discriminating control — pin test-binary concurrency to 1, then load a lone `--lib` binary — which has been named since 2026-08-09 and diff --git a/docs/ci-red-signatures.md b/docs/ci-red-signatures.md index 255767f..86859b6 100644 --- a/docs/ci-red-signatures.md +++ b/docs/ci-red-signatures.md @@ -1076,3 +1076,20 @@ discriminating control U9 named is STILL UNRUN**: pin test-binary concurrency to 1, and separately load a lone `--lib` binary. Four incidents is enough evidence that the family will keep costing review rounds until someone runs it. + +### U13 — gate prune-reporting row receives empty child stdout in `sweep` + +Recorded during PR #244 review, 2026-08-29, on signed head `756c2b8`. +The first six gate stages were green; `07-sweep` produced this one red; +`08-diff-check` remained green. + +| field | value | +| --- | --- | +| **selector** | `--test gate_script_acceptance skipped_directories_are_reported_with_a_reason` | +| **job / step** | local (Linux), `scripts/gate` step `07-sweep`, log `20260829T171606Z-1087848` | +| **required fragments** | `skipped_directories_are_reported_with_a_reason` + `the unmarked directory must be named with its reason; output was:` followed by empty output | +| **status** | **one occurrence; exact selector and the full 36-test binary both green on immediate rerun** | +| **what IS established** | the test observed empty stdout from its `scripts/gate --prune` child even though its fixture had created an unmarked lookalike which a successful prune must name. The row discards the child's stderr and success status (`let (out, _, _)`), so the durable failure cannot distinguish wrong successful output from a refused or failed child invocation | +| **what is NOT** | any mechanism. Another row in the same test binary mutates shared git-worktree metadata, but concurrent execution is only a candidate; this occurrence did not capture the child status or stderr needed to support it | +| **why this branch is excluded** | the lane changes two assertion-message strings and three docs. `scripts/gate` and `tests/gate_script_acceptance.rs` are byte-identical to the base; the `async_runtime` edit is inside its unit-test module, and the other Rust edit belongs to a different integration-test binary | +| **next occurrence** | preserve the child success status and stderr in the assertion before rerunning. A green rerun establishes intermittence only; it cannot reconstruct why stdout was empty |