diff --git a/docs/remediation/KICKSTART.md b/docs/remediation/KICKSTART.md index 662a7557..1bfd3c24 100644 --- a/docs/remediation/KICKSTART.md +++ b/docs/remediation/KICKSTART.md @@ -25,8 +25,15 @@ mechanically until Build 3 (rotation) makes it automatic. ## Standing invariants (never violate) - **North star:** deterministic-right-answer → code/gate; LLM only for judgment. -- **Delivery gates:** author≠reviewer; PRE-REGISTERED diff-blind checks committed before reading the diff; - CI terminal-green; completion = merged PR + closed issue. rev-974 = the mosaicstack reviewer identity. +- **Delivery gates — REFERENCE the canonical files, never restate them:** + `~/.config/mosaic/fleet/roles.local/merge-gate.md` (verdict authority) and + `~/.config/mosaic/fleet/roles/validator.md` (validator role). Order: + independent review (author ≠ reviewer, `rev-974`; pre-registered diff-blind checks committed before the + diff is read) → remediation → **CI terminal-green at the exact head by full step scan** → + **merge-gate verdict `GO`/`NO-GO`/`HOLD`**, commit-bound and **void the instant the head moves**, posted + durably with enumerated evidence under its own minted identity → **coordinator head-pinned merge**. + The queue guard runs but is **zero-information until RM-03 lands** (D-23) and must not be cited as evidence. + **After a `GO`, freeze pushes** — even a doc tweak voids the verdict. The coordinator assigns the gate seat. - **Dogfooding:** every fix validated against its live seed case (MISSION.md lists them). - **Tracking → DB** (hard cutover); do NOT re-invest in flat-file tracking. jarvis-brain PDA is off-limits. - **Git identity:** export `MOSAIC_GIT_IDENTITY=` so wrappers author correctly and survive respawn. diff --git a/docs/remediation/MISSION.md b/docs/remediation/MISSION.md index 9db7a63e..6a77de6f 100644 --- a/docs/remediation/MISSION.md +++ b/docs/remediation/MISSION.md @@ -186,6 +186,29 @@ orphaned context loader, a fail-open bypass. **Work = wire + consolidate + retir - **Project orchestrator** `mos-remediation` (this seat) owns the mission; coordinates under Mos (lead). - **Adversarial task decomposition:** `planner-opus` (robustness) + `planner-sol` (pragmatic) each decompose the plan independently; orchestrator reconciles into `TASKS.md`/DB tasks. Oppositional by design. -- **Delivery gates (non-negotiable):** author≠reviewer, PRE-REGISTERED diff-blind acceptance checks committed - before reading the diff, CI terminal-green, completion = merged PR + closed issue. rev-974 = mosaicstack reviewer. +- **Delivery gates — REFERENCE, do not restate.** The authoritative definitions live at + [`~/.config/mosaic/fleet/roles.local/merge-gate.md`](file:///home/hermes/.config/mosaic/fleet/roles.local/merge-gate.md) + (verdict authority) and + [`~/.config/mosaic/fleet/roles/validator.md`](file:///home/hermes/.config/mosaic/fleet/roles/validator.md) + (validator/certificate role). **Read them; do not paraphrase them.** Restating an authoritative source + is lossy every time — see D-26, where a subset restated from memory dropped a security precondition. + + **Gate order** (the sequence only; the definitions are in the files above): + 1. Independent review, **author ≠ reviewer** (`rev-974` on mosaicstack), with PRE-REGISTERED diff-blind + acceptance checks committed before the diff is read + 2. Remediation of findings + 3. **CI terminal-green** at the exact full-40 head, by **full step scan** + 4. **Merge-gate verdict — `GO` / `NO-GO` / `HOLD`** (class `merge-gate`; "Ultron" is an _instance name_, + display data, never an authority source). **Bound to a commit and VOID the instant the head moves.** + `HOLD` persists until replaced; a `NO-GO` answered by an empty commit must be re-issued as `NO-GO`. + Posted durably on the PR under the gate's own minted identity, **enumerating** its evidence — a bare + "GO — gates verified" is non-conforming. + 5. **Coordinator merge**, head-pinned. The gate never merges; it holds `push=False` by design. + + ⚠ **The CI queue guard runs but is ZERO-INFORMATION until RM-03 lands** (D-23: it returns pass for every + possible input). It must not be cited as evidence by any gate, including the coordinator's own merge path. + + **Assignment:** the coordinator assigns the merge-gate seat; the orchestrator does not. The orchestrator + owns getting a PR _gate-ready_. + - **Compaction survival:** see `KICKSTART.md` in this dir — the resume procedure. Persist typed state, not transcript. diff --git a/docs/remediation/TASKS.md b/docs/remediation/TASKS.md index edb7868d..bf104421 100644 --- a/docs/remediation/TASKS.md +++ b/docs/remediation/TASKS.md @@ -146,6 +146,55 @@ exposure or changing provider protected-pipeline posture is a host security-post infrastructure authority. Nothing is blocked meanwhile — RM-02's head is unprivileged and fail-closed, the privileged experiment stays uncommitted and out of branch history. +### D-26 — render-not-restate failed at maximal attention, committed by the rule's own enforcer + +**The definitive justification for making render-not-restate mechanical.** + +The mission's delivery-gate definition was **incomplete from setup**: the merge-gate verdict step was +missing. Root cause, stated by the coordinator: when `MISSION.md` / `KICKSTART.md` were written, the +gates were **restated from memory** — _"author ≠ reviewer, diff-blind checks, CI-green, merged-PR +completion"_ — a subset of an authoritative document that was not open at the time. The omission then +**propagated into every worker brief issued for the rest of the mission.** + +**Then it happened again, in the correction.** The message correcting the restatement error was itself a +restatement: delivered from memory, without the source open, and it dropped or altered five things — + +| stated | actual (`fleet/roles.local/merge-gate.md`) | +| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| verdict is `APPROVE`/`BLOCK` | **`GO` / `NO-GO` / `HOLD`** | +| — | **verdict is commit-bound and VOID the instant the head moves**; `HOLD` persists; an empty-commit answer to `NO-GO` must be re-issued as `NO-GO` | +| — | the gate verifies mechanical gates **itself from primary evidence** (reviewed-SHA == CI-SHA == head, full step scan, `Closes #N`, queue guard) | +| — | the verdict must be **posted durably, enumerating evidence**; a bare "GO — gates verified" is **non-conforming** | +| cite `guides/CANONICAL-DELIVERY-CYCLE.md` | **that file does not exist** — the path was taken from another brief and cited without checking it resolves | + +**And the omission was safety-relevant.** The role doc carries a hard install precondition: an unminted +gate seat's credentials **fail open to the owner's admin account**, so its verdicts would post as admin — +_"the exact mechanism of the #3084 breach this seat exists to prevent."_ Verified: gate identities existed +for USC only, none for mosaicstack (D-15's class, on the seat that authorises merges). Assigning the gate +at that moment would have reproduced the breach it was created to stop. + +**Why this is the definitive case, and not just a third instance.** The failure occurred when every +condition favoured success: **attention was maximal** (a deliberate correction), **the actor knew the rule +best** (its author and enforcer), and **the subject was the rule itself** — the message was _about_ +render-vs-restate while committing it. A discipline that fails under those conditions does not fail from +carelessness; it fails because **human recall of a structured document is lossy by construction, and the +loss is silent.** + +> **A rule that its own enforcer cannot follow while enforcing it is not a discipline. It is a +> requirement for a mechanism.** + +**Requirement.** Governing documents must **reference** authoritative sources, never paraphrase them, and +**every reference must resolve** — a dangling pointer to a non-existent authority is _worse_ than a +restatement, because it reads as authoritative and cannot be checked. RM-02 registers both: a link-resolution +case (every cited authority path exists) with a must-fail control, and the D-20 clause that prose asserting a +property needs a negative control. + +**Resolved:** `MISSION.md` and `KICKSTART.md` now **reference** `fleet/roles.local/merge-gate.md` and +`fleet/roles/validator.md` and state only the gate _order_. The precondition was cleared properly — +`gitea-mosaicstack-merge-gate.token` minted at **least privilege**, independently verified by this +orchestrator as the seat's own token: `pull=True, push=False, admin=False` — it **structurally cannot merge**, +which is what a verdict authority must be. + ### D-25 — self-verification by the audited party, a second time, one layer down RM-02's per-commit replay needs isolation. Docker denied Bubblewrap namespace creation; the obvious fix