diff --git a/docs/remediation/TASKS.md b/docs/remediation/TASKS.md index fa0b27ed..c463f25b 100644 --- a/docs/remediation/TASKS.md +++ b/docs/remediation/TASKS.md @@ -93,6 +93,33 @@ and must not be cited as merge evidence. Rely on reviewer clearance + real CI. Three independent live instances in a single session — format gate, agent context reset, queue guard — is the class confirmed, not anecdote. +### D-10 — the queue guard's failure modes are exactly backwards + +`ci-queue-wait.sh` — a **required** pre-push/pre-merge gate — was observed this session doing both of +these: + +- **Fails OPEN on an unknown result.** `state=unknown ⇒ exit 0`, five times, during real pushes and + real merges. It also evaluates `branch=main` rather than the branch being acted on. +- **Fails CLOSED on credential resolution.** In a worker seat it aborted with + `Gitea token not found`, hard-blocking a legitimate push of completed, tested work. The worker + correctly stopped (Constitution gate 8). The identical command run from that worker's _own worktree_ + in another shell succeeded, so the checkout and remote were fine — the difference was the worker's + process environment. + +**A gate that waves through work it never checked, and blocks work that is ready, has its failure +modes inverted.** Availability failures (cannot reach the provider, cannot resolve a credential) +should degrade to a loud, auditable _inability to assert_ — never to a hard stop on delivery, and +never to a silent pass. Correctness failures (unknown, malformed, terminal-failure) are what must +block. + +This is also the **Pi-brick shape** (P-RECOVERY-001): a gate whose own unavailability prevents the +work needed to recover from it. + +**Requirement on RM-03, extending its existing two defects:** the guard must distinguish +`CANNOT_ASSERT` (credential/transport/provider unavailable — loud, audited, does not silently pass and +does not permanently block) from `ASSERTED_NOT_READY` (a real non-green CI state — blocks). Both are +registered R-002 cases with must-fail controls; neither may exit 0 silently. + ### D-9 — the comms path shell-interprets message bodies (injection-shaped, found by accident) Sending a status message with `agent-send.sh -m "...`backticks`..."` caused bash to **execute** the