diff --git a/core/cli_test.py b/core/cli_test.py index a02e9301..af52cc97 100644 --- a/core/cli_test.py +++ b/core/cli_test.py @@ -289,18 +289,18 @@ TEST_SUITES: dict[str, tuple[str, ...]] = { ), "formation": ("tests/formation",), "proof": ("tests/test_proof_properties.py",), - # ADR-0024 chain suites (Phases 2-6). Each phase has its own contract - # tests so reviewers can run them independently; ``adr-0024`` runs the full - # chain end-to-end. - "refusal": ("tests/test_refusal_contract.py",), - "margin": ("tests/test_margin_admissibility.py",), - "rotor": ("tests/test_rotor_admissibility.py",), - "inner-loop": ( - "tests/test_inner_loop_admissibility.py", - "tests/test_inner_loop_phase2.py", - "tests/test_inner_loop_phase3.py", - "tests/test_inner_loop_phase4.py", - ), + # ADR-0024 chain suites (Phases 2-6). ``adr-0024`` runs the full chain + # end-to-end; ``phase5``/``phase6`` survive because README.md and the + # forward_semantic_control READMEs invoke them by name. + # + # PR-3b (Wave 1, 2026-07-28) — four per-phase aliases deleted: ``refusal``, + # ``margin``, ``rotor``, ``inner-loop``. Each was offered so reviewers could + # run a phase independently, and measured across the repository, **nothing + # invoked any of them** — zero `--suite` references in code, docs, ADRs, + # workflows or the CLI's own help. Every one of their seven files is still + # covered by ``adr-0024``, so no coverage moved and nothing was orphaned. + # An alias nobody calls is not a curation decision; it is a name that has to + # be kept true. Two ratchets (membership, reachability) were policing these. "phase5": ("tests/test_phase5_corpus.py",), "phase6": ("tests/test_phase6_demo.py",), "adr-0024": ( diff --git a/docs/assessment/02-layer-taxonomy.md b/docs/assessment/02-layer-taxonomy.md index 7d1630b8..03e0eca6 100644 --- a/docs/assessment/02-layer-taxonomy.md +++ b/docs/assessment/02-layer-taxonomy.md @@ -137,7 +137,7 @@ All 33 zones, mapped once. Liveness is the map's 2026-06-09 label — **48 days | ingest-boundary | M2 | partial-wiring-debt | | | ingest-compiler | M2 | partial-wiring-debt | | | sensorium-afferent | M2 | inert | | -| sensorium-falsification | M2 | live-internal | map labels it "L12" — a stratum no other document uses; flag for ruling | +| sensorium-falsification | M2 | live-internal | map labelled it "L12" — a stratum no other document uses. **Ruled 2026-07-28 (R-7): dropped.** No in-repo generator emits it (the system map is local and gitignored, per D5 a regeneratable index carrying no authority), so nothing in the repository was changed — the phantom existed only in a local artifact and in this row. Recorded rather than silently deleted, so the next reader does not re-derive it. | | L4-recognition | M3 | partial-wiring-debt | | | L5-cognition | M3 | partial-wiring-debt | | | comprehend-organ ⚑ | M3 | live-serving | zero subsystems mapped | diff --git a/docs/assessment/30-gap-register.md b/docs/assessment/30-gap-register.md index 43fe2fd8..335f0004 100644 --- a/docs/assessment/30-gap-register.md +++ b/docs/assessment/30-gap-register.md @@ -42,6 +42,20 @@ What remains owed is the **ceremony**, and it is this assessment's own §8 maint A recorded prose result with no pinned digest is **testimony, not evidence** — the same failure mode as the map, the ratchet, and the blueprint. +**Absorbed 2026-07-28 (R-7, PR-3) — the substrate-liveness ratchet's seven OPEN items.** The ratchet is now historical; every one of its open entries was L10-chained, which is this entry, so they live here rather than in a stale instrument: + +| Item | What it is | Chain | +|---|---|---| +| **W-003** | `VaultPromotionPolicy` dormant | audit-dependency on L10 | +| **W-005** | E0/E2 readback modulation absent | W-004 → W-005 | +| **W-007** | `DerivedRecognizer` not integrated into the live turn loop | W-003 → recognizer-storage ADR → W-007 | +| **W-008** | Runtime model (L10) scope adoption | scope landed (#236); spike/ADR pending | +| **W-009** | HITL async queue surface | W-008 → W-009 | +| **W-017** | Automated T1/T2 → T3 promotion absent | W-009 → W-017 | +| **W-018** | ADR-0080 contemplation not autonomous | W-008 → W-018 | + +Their dependency reasoning is still sound and is the ratchet's lasting contribution; its *status column* was not, which is why the instrument is retired and its content is not. + **Two prior claims in this entry were wrong and are withdrawn.** (a) *"No suite contains any `l10`/`always_on` test"* was a scan artifact: `TEST_SUITES["full"] = ("tests/",)` is a **directory**, so every test file is trivially in a suite. The true statement is that the five `tests/test_l10_*.py` files are in **no curated suite tuple** — reachable only through `full`. (b) *"nothing runs its pins"* is false: CI never invokes `core test --suite`, it runs raw pytest with marker filters, and no L10 file carries `quarantine` or `slow` — so the pins **execute twice a day**, in `full-pytest.yml` (post-merge) and `nightly-full-pytest.yml` (cron `0 2 * * *`). The correct statement is that **nothing runs them on any pre-merge gate**. **Evidence:** `M6` + `always-on-process` cards; `evals/l10_always_on/contract.md`; `core/cli_test.py:13`; `.github/workflows/{smoke,full-pytest,nightly-full-pytest}.yml`. · **Authority:** execution + the R-9 evidence-standard and cadence ruling. diff --git a/docs/assessment/31-hindrance-audit.md b/docs/assessment/31-hindrance-audit.md index 584db68c..f4f7dad0 100644 --- a/docs/assessment/31-hindrance-audit.md +++ b/docs/assessment/31-hindrance-audit.md @@ -85,6 +85,7 @@ The surviving delta is **not a containment hole** — refusal is fail-closed and **Why it hinders:** an instrument that *looks* authoritative converts "I should check" into "I already checked." Phase 0's error was this mechanism operating on this assessment. **Better home:** this register supersedes `docs/gaps.md` (marked historical); the ratchet's 7 OPEN items migrate here (G-5 absorbs their L10 dependency); the map stays a regeneratable local index per D5, with "L12" dropped; the assessment directory becomes the standing ruled record, `verified_at`-stamped. **Authority:** ruling (one PR). +**Status (2026-07-28): CLOSED — R-7 ruled A; PR-3 landed.** `docs/gaps.md` and the substrate-liveness ratchet both carry historical banners naming this entry's own mechanism as the reason. The ratchet's seven OPEN items (W-003/005/007/008/009/017/018, all L10-chained) migrated into G-5 with their dependency chains. `L12` had no in-repo generator — the map is local and gitignored — so the phantom is recorded as ruled rather than deleted, which is the honest form. ## H-10 · The demotion that mispriced the paradigm experiment **Verdict:** `strained` framing — a correct ruling casting an incorrect shadow · **Layers:** M3/governance diff --git a/docs/assessment/50-execution-plan.md b/docs/assessment/50-execution-plan.md index 4972d4d0..0e45e8e5 100644 --- a/docs/assessment/50-execution-plan.md +++ b/docs/assessment/50-execution-plan.md @@ -205,9 +205,22 @@ The assessment directory's own corrections (N-1…N-7 applied to `30-gap-registe ### PR-2 · Delete the decoration · **S** · H-2 `DriveGradientMap` construction at `chat/runtime.py:716` and the class; `InhibitionMask`/`InhibitionOperator` exports from `core/physics/__init__.py`. Their *intents* are preserved in writing first: drive → the CR-2 design brief (G-4), the mask → the CR-1 ADR (G-14). **Verification:** the sabotage test in reverse — full `smoke` plus the deduction and cognition suites must be byte-identical before and after; a deletion that changes a surface means the object was not decoration and the PR is abandoned. -### PR-3 · Retire the dead instruments · **S** · H-9 +### PR-3 · Retire the dead instruments · **S** · H-9 — **LANDED 2026-07-28** (R-7 ruled A) `docs/gaps.md` → historical banner pointing at `30-gap-register.md`; substrate-liveness ratchet → historical, 7 OPEN items migrated into G-5; the phantom `L12` stratum dropped from the local map generator. Per R-7. +**Landed.** Both banners written, naming *why* rather than just *what* — H-9's mechanism (an authoritative-looking instrument converts "I should check" into "I already checked") is quoted in the banner it explains. All seven OPEN ratchet items (**W-003, W-005, W-007, W-008, W-009, W-017, W-018** — every one L10-chained) migrated into G-5 with their dependency chains intact, because that reasoning is the ratchet's lasting contribution and its status column is not. + +**One deliverable could not be executed as written, and is recorded rather than claimed:** `L12` has **no in-repo generator to drop it from**. The system map is local and gitignored (D5: a regeneratable index carrying no authority), so the phantom existed only in that local artifact and in one taxonomy row. The row now records the ruling instead of the flag. + +### PR-3b · Collapse the suite aliases · **S** · *new, Wave 1* — **LANDED 2026-07-28** +Not in the original plan. Added when PR-4's two ratchets made the question unavoidable: *what exactly are they policing?* Measured — **21 curated suites, 9 holding exactly one file, 12 holding ≤4, and 2 reachable from any gate.** + +The cut is much smaller than the sprawl suggests, and the measurement is why. `cognition`, `teaching`, `packs`, `algebra` are named in **AGENTS.md's own pre-merge-gate instruction**; `fast`, `pulse`, `proof` in the CLI's help text; `phase5`, `phase6`, `adr-0024`, `math`, `formation` in READMEs and ADRs. Deleting those breaks documented commands — worse than the sprawl. + +**Four suites had zero `--suite` references anywhere in code, docs, ADRs, workflows or CLI help: `refusal`, `margin`, `rotor`, `inner-loop`.** Per-phase ADR-0024 aliases offered so reviewers could run a phase independently; nothing ever did. All seven of their files remain covered by `adr-0024`, so **nothing was orphaned and no coverage moved** — verified before the cut, not after. + +**21 → 17 suites.** Pin 3's gate-unreachable gap went **19 → 15 by deletion**, which costs no gate time — the ratchet turning the way it should. An alias nobody calls is not a curation decision; it is one more name that has to be kept true, and two ratchets were policing these. + --- ## 4. Wave 2 — Simplify & enforce diff --git a/docs/audit/substrate-liveness-ratchet.md b/docs/audit/substrate-liveness-ratchet.md index 17c653b2..1128b609 100644 --- a/docs/audit/substrate-liveness-ratchet.md +++ b/docs/audit/substrate-liveness-ratchet.md @@ -1,3 +1,13 @@ +> **HISTORICAL — superseded 2026-07-28 (R-7, ruled).** +> Last revised ~2026-05-24 and stale since. Its **seven OPEN items — W-003, +> W-005, W-007, W-008, W-009, W-017, W-018 — are all L10-chained** and have +> migrated into **G-5** of the live register +> ([`docs/assessment/30-gap-register.md`](../assessment/30-gap-register.md)), +> which carries the L10 proof debt with current evidence. +> +> Kept for its dependency reasoning, which is still good; not for its status +> column, which is not. Do not add entries here. + # Substrate Liveness Ratchet — v5 (quick-wins lane cleared: W-011/W-012/W-015/W-016 closed) **Scope:** [substrate-liveness-audit-scope](../adr/substrate-liveness-audit-scope.md) (v2) diff --git a/docs/gaps.md b/docs/gaps.md index edb64bd2..2cee8743 100644 --- a/docs/gaps.md +++ b/docs/gaps.md @@ -1,3 +1,14 @@ +> **HISTORICAL — superseded 2026-07-28 (R-7, ruled).** +> This register closed its 26th and last entry and has taken no entry from any +> 2026-06+ arc. The live register is +> [`docs/assessment/30-gap-register.md`](assessment/30-gap-register.md). +> +> It is kept for its history, not its authority. H-9's mechanism is why this +> banner exists: *an instrument that looks authoritative converts "I should +> check" into "I already checked"* — and Phase 0 of the holistic assessment was +> that mechanism operating on the assessment itself. Two dead registers plus a +> live one is worse than one live one. + # Capability Gaps This file tracks registered blockers for capability progression. Open diff --git a/tests/test_suite_reachability.py b/tests/test_suite_reachability.py index 44f6ca75..ebcd56fb 100644 --- a/tests/test_suite_reachability.py +++ b/tests/test_suite_reachability.py @@ -11,7 +11,7 @@ PR-4 itself raised against G-7's original formulation: *a curated suite nobody runs is the same non-guarantee as ``full``, wearing a different name.* The fix had the same blind spot as the thing it fixed. -Measured at 2026-07-28: **21 curated suites, 2 gate-reachable.** ``smoke`` and +Measured at 2026-07-28: **21 curated suites, 2 gate-reachable** — then **17 and 2** after PR-3b deleted four aliases nothing invoked. ``smoke`` and ``deductive`` are invoked by ``scripts/hooks/pre-push`` and ``scripts/ci/local-ci.sh --tier gate``; the other nineteen have members and no caller. That is why this is a **baseline plus ratchet** and not a flat rule — @@ -47,7 +47,11 @@ _ROOT = Path(__file__).resolve().parents[1] #: So the set is declared here and *verified* against the shell below. GATE_SUITES: frozenset[str] = frozenset({"smoke", "deductive"}) -#: Curated suites with members and no gate caller, measured 2026-07-28. +#: Curated suites with members and no gate caller. +#: 19 at first measurement; **15 after PR-3b (Wave 1) deleted four unreferenced +#: per-phase aliases** — `refusal`, `margin`, `rotor`, `inner-loop`. That is the +#: ratchet turning the way it is supposed to: the gap shrank by deletion rather +#: than by promotion, which costs no gate time at all. #: This list may only SHRINK. A suite leaves it by being invoked from a gate #: tier — not by being deleted from this file. UNREACHABLE_BASELINE: frozenset[str] = frozenset( @@ -58,16 +62,12 @@ UNREACHABLE_BASELINE: frozenset[str] = frozenset( "fast", "formation", "full", - "inner-loop", - "margin", "math", "packs", "phase5", "phase6", "proof", "pulse", - "refusal", - "rotor", "runtime", "sensorium", "teaching", @@ -164,13 +164,14 @@ def test_baseline_has_no_stale_entries() -> None: def test_recorded_gate_gap_matches_the_measurement() -> None: """Pin the number so the gap moving is a reviewed decision, not a drift. - 19 of 21 at 2026-07-28. Shrinking this is the point — it shrinks by putting + 15 of 17, after PR-3b. (19 of 21 before it.) Shrinking this is the point — it shrinks by putting a suite on the gate, which costs gate time and is therefore a decision someone has to make deliberately. """ - assert len(UNREACHABLE_BASELINE) <= 19, ( - f"gate-unreachable suites grew to {len(UNREACHABLE_BASELINE)} (was 19). " - "The ratchet only turns one way." + assert len(UNREACHABLE_BASELINE) <= 15, ( + f"gate-unreachable suites grew to {len(UNREACHABLE_BASELINE)} (was 15; " + "19 before PR-3b deleted four unreferenced aliases). The ratchet only " + "turns one way." )