feat(tests): curated-suite membership ratchet — and PR-4's parity pin withdrawn (PR-4, G-7, N-9)

N-9 is the finding, and it PREVENTS work rather than re-scoping it.

WHAT THE PLAN GOT WRONG. N-3 concluded the 23-vs-13 smoke delta was unintended
drift, on two in-repo comments asserting parity, and called that "the strongest
evidence available that the drift was never intended". H-12 repeated it; R-14
built three options on it recommending "raise CI, +46s measured"; PR-4
specified a bidirectional parity pin as deliverable one.

A third artifact answers all of it, and none of them read it.
tests/test_cli_test_suites.py::test_cli_smoke_suite_covers_ci_smoke_gate has
pinned smoke.yml SUBSET-OF TEST_SUITES["smoke"] since before this assessment —
which is why every measurement finds CI-only == 0; a pin, not luck — beneath a
comment headed "DELIBERATELY ONE-DIRECTIONAL — do not 'complete' this by also
asserting local_paths <= ci_paths". Its history is 50fa287d (2026-07-25):
"revert(tests): drop the local-to-CI smoke parity assertion — CI is not a
gate." An earlier agent read the same comment, drew the same inference, made
the assertion symmetric, and reverted it hours later: "That was wrong, and
AGENTS.md says so in a line I had already read."

AGENTS.md:280 — GitHub is "a mirror only; its Actions are billing-locked and
produce dead signals — never chase them." §277 — the workflows are "secondary
observability only." So the local suite is the SOURCE and is deliberately
broader; the delta is the design.

  - PR-4 pin 1: WITHDRAWN. It exists, in the direction that protects something.
  - R-14: premise corrected in the packet. Option A spends 46s on a workflow
    that does not gate; option B would delete real protection for a fiction;
    option C's live half is a two-line comment fix, done here.
  - N-3's exposure claim was too GENEROUS to CI: for a push that skipped the
    local gate there is no automatic check at all. Larger than stated, and not
    closable by editing smoke.yml.

WHAT LANDED. Measured: 749 of 877 test files are in no curated suite. The
plan's mechanism ("assign every orphan, or 749 exclusion reasons") is hollow at
that scale — glob topic-suites ("adr": tests/test_adr_*.py absorbs 172) satisfy
the assertion while changing nothing about what executes, which is precisely the
Third-Door objection the plan levels at G-7's own first formulation. All four
demonstrated incidents (#113, #136, negation-survives-articulation,
speculative-subject-lifecycle) were caused by a NEWLY LANDED orphan; none by a
legacy one.

So: a ratchet. tests/test_suite_membership.py + tests/full_only_baseline.txt.
New orphans fail. The baseline is enforced in BOTH directions — a promoted or
deleted file must leave it, so the list can only shrink — and its count is
pinned so bulk movement is a reviewed decision, in the discipline
test_volume_honesty.py uses.

Also: the gate-guarding pin now runs on the gate. test_cli_test_suites.py lived
in `fast`; the pre-push gate runs smoke + deductive. The pin guarding the gate
did not run on the gate.

Three sabotages, each OBSERVED RED: a new unregistered test file, a stale
baseline entry, the parity pin demoted out of smoke.

Note on the delta: now 12 (local 27, CI 15) because this session added three
pins locally. Under the corrected reading that is the design, not widening
drift — the invariant is CI-only == 0, and that is pinned. The registers now
say so; "ten files" was a measurement, never a target.

Process note: `git checkout --` during sabotage cleanup destroyed uncommitted
edits to core/cli_test.py, which were redone. Backups, not checkout, on files
with unstaged work.

Registers: G-7 CLOSED, H-12 amended, R-14 dissolved in the packet, PR-4
re-specified, N-9 added to plan §0.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wcw2pnMBwyvmNyQg4uPEt4
This commit is contained in:
Claude 2026-07-28 04:03:19 +00:00
parent 98a6e8b439
commit 68e68589a2
No known key found for this signature in database
8 changed files with 1056 additions and 12 deletions

View file

@ -29,10 +29,19 @@ TEST_SUITES: dict[str, tuple[str, ...]] = {
"tests/test_audit_ledger_r7.py",
"tests/test_architectural_invariants.py",
"tests/test_cli_runner_contract.py",
# Audio sensorium lane — part of the smoke.yml PR gate (compiler,
# CRDT merge, eval gates, pack manifest, mount, teachers; ~3s).
# Audio sensorium lane — also named in smoke.yml (compiler, CRDT
# merge, eval gates, pack manifest, mount, teachers; ~3s).
# Listed explicitly so the local-first pre-push gate (AGENTS.md
# protocol) equals the CI gate rather than silently narrowing it.
# protocol) is never NARROWER than smoke.yml. It does not "equal"
# it, and must not: this tuple is the SOURCE and is deliberately
# broader (AGENTS.md §277/§280 — the workflows are secondary
# observability, GitHub Actions are billing-locked dead signals).
# The one-directional pin is
# tests/test_cli_test_suites.py::test_cli_smoke_suite_covers_ci_smoke_gate,
# whose symmetric version was tried and reverted in 50fa287d
# (2026-07-25). Corrected 2026-07-28 per N-9: the earlier wording
# claimed an equality that has never held and twice sent readers
# looking for drift that is a design decision.
"tests/test_audio_compiler.py",
"tests/test_audio_crdt_merge.py",
"tests/test_audio_eval_gates.py",
@ -101,6 +110,19 @@ TEST_SUITES: dict[str, tuple[str, ...]] = {
# is "failures are typed, never silent" (INV-34). Registered in both
# gates on creation, per #136. ~6s.
"tests/test_accrual_swallow_telemetry.py",
# PR-4 / G-7 — a new test file may not land outside every curated
# suite. Four times in-repo a pin was written for a real defect,
# registered nowhere, ran on no pre-merge gate, and the thing it
# pinned regressed anyway (#113, #136, negation-survives-articulation,
# speculative-subject-lifecycle). A ratchet against
# tests/full_only_baseline.txt blocks the recurrence; the 749 legacy
# full-only files stay a declared, shrinking number rather than 749
# invented justifications (N-9). Filesystem + glob only, <1s.
"tests/test_suite_membership.py",
# The smoke/CI parity pin must run on the gate it guards. It enforces
# that this tuple is never NARROWER than smoke.yml — and it lived in
# `fast`, which the pre-push gate does not run (N-9). ~1s.
"tests/test_cli_test_suites.py",
# ADR governance. An ADR that governs a default-ON flag records a
# decision already in force, so leaving it "Proposed" makes the
# governance record assert something false about the running system —

View file

@ -65,7 +65,15 @@ Suite tuples are hand-curated; a test file in zero *curated* suites is indisting
2. **Curated-suite membership** — every `tests/**/test_*.py` is in ≥1 suite **excluding `full`**, or in a registered exclusion list with a one-line reason.
Pin 1 exists because the two gates have **already** drifted (see H-12): the local suite is 23 files, `smoke.yml` is 13, and the 10-file delta includes ADR-0265's denial pin, both ADR-governance pins, volume honesty, and curriculum polarity. Measured parity cost: **429 tests in 46s** on the Act runner's own hardware.
**Evidence:** `MV` card; `core/cli_test.py:13`; `.github/workflows/smoke.yml`; H-12. · **Authority:** mechanical (small PR) for the pins; the R-14 ruling for the parity *direction*.
**CLOSED 2026-07-28 — and pin 1 was withdrawn rather than built (N-9).**
*Pin 1 was already in the repository, in the only direction that protects anything.* `test_cli_smoke_suite_covers_ci_smoke_gate` has pinned `smoke.yml ⊆ TEST_SUITES["smoke"]` throughout (which is why every measurement above finds **CI-only = 0** — a pin, not luck), under a comment reading *"DELIBERATELY ONE-DIRECTIONAL."* The symmetric version was written and reverted the same day in `50fa287d` (2026-07-25), because `AGENTS.md:280` makes GitHub Actions *"billing-locked … dead signals"* and §277 makes the workflows *"secondary observability only."* This entry's "the two gates have already drifted" is therefore a **misreading of a design decision**, and the delta is not a defect to close.
*Pin 2 shipped, re-specified.* Measured **749 of 877** test files in no curated suite. The mechanism this entry proposes — assign every orphan, or list it with a reason — is hollow at that scale for the same reason the entry itself identifies: glob topic-suites satisfy the assertion while changing nothing about what runs. All four demonstrated incidents were caused by a *newly landed* orphan, never a legacy one, so what shipped is a **ratchet**: `tests/test_suite_membership.py` + `tests/full_only_baseline.txt`, blocking new orphans, enforced in both directions, count pinned. Three sabotages observed red.
*One real gap the entry was circling, now fixed:* the parity pin lived in `fast`, which the pre-push gate does not run — **the pin guarding the gate did not run on the gate**. It is now in `smoke`.
**Evidence:** `tests/test_suite_membership.py`; `tests/full_only_baseline.txt`; `tests/test_cli_test_suites.py:49`; `50fa287d`; `AGENTS.md:275-280`. · **Authority:** discharged mechanically; **no R-14 ruling is owed** for any of it.
### G-8 · No flag-default register **[AMENDED N-7]**
**Layer:** cross-cut · **Leverage: 8**

View file

@ -107,6 +107,15 @@ Every guard stays **deliberately broad**. Narrowing them to `ImportError`/`OSErr
**Better home:** the gate-parity pin in G-7 — the drift is only invisible because nothing measures it. Measured parity cost: **429 tests in 46s** on the Act runner's own hardware (`ubuntu-latest:host` = native macOS host).
**Authority:** R-14 sets the direction (raise CI, or lower local, or keep them different and correct the comment); the pin itself is mechanical.
**AMENDED 2026-07-28 (N-9) — "the drift was never intended" is withdrawn. It was intended, deliberated, and recorded.**
A third artifact settles what two comments only suggested. `tests/test_cli_test_suites.py::test_cli_smoke_suite_covers_ci_smoke_gate` has enforced `smoke.yml ⊆ TEST_SUITES["smoke"]` all along — which is *why* this entry's own measurement finds **CI-only = 0** — and carries a comment headed *"DELIBERATELY ONE-DIRECTIONAL — do not 'complete' this by also asserting `local_paths <= ci_paths`."* Its history is `50fa287d` (2026-07-25): the bidirectional assertion was added and reverted the same day, because `AGENTS.md:280` makes GitHub Actions *"billing-locked … dead signals — never chase them"* and §277 makes the workflows *"secondary observability only."*
So: **the local suite is the source and is free to be broader**; the ten-file delta is the designed state, not drift. What this entry got right is narrower and still true — *one in-code comment* (`core/cli_test.py`'s audio block) and `scripts/hooks/pre-push`'s "exact CI-gate parity" line both assert an equality that does not hold and should be corrected to say what the pin says.
**And the real gap this entry was circling is elsewhere:** the parity pin lives in the `fast` suite, while the pre-push gate runs `smoke` + `deductive`. **The pin guarding the gate does not run on the gate.** That is the mechanical fix worth making, and it is ruling-free. *(Status: promoted into `smoke` on 2026-07-28.)*
**On the number itself — "ten files" is not an invariant and should stop being quoted as one.** Measured at `98a6e8b4`+ the delta is **12** (local 27, CI 15), because this session added three pins to the local suite. Under the corrected reading that is the design working, not drift widening: the local suite is the source and grows as pins are written; `smoke.yml` is observability and is edited only when convenient. **The invariant is `CI-only == 0`**, and that one is pinned. Earlier entries in this directory quote 10 (and 24/14, 25/15) as measurements true on their date; none of them is a target.
## H-13 · The speculative-marker cache un-marks a sibling proposal's material on promotion
**Verdict:** defect — honesty regression on a served marker · **Layers:** M4/M5
**Evidence:** `_speculative_subjects` is a flat token `OrderedDict` with no owner tracking (`core/cognition/pipeline.py:161`). A SPECULATIVE proposal seeds its subject plus every ≥4-char non-stopword token (`:726-729`); on COHERENT promotion, `_forget_speculative_subject` pops the subject and each token **regardless of which proposal added it** (`:736-739`, `:1045-1055`). Promoting "practical wisdom" therefore evicts the shared token "wisdom" while an independent "wisdom" proposal is still SPECULATIVE — and that proposal's material is then served **without its marker**.

View file

@ -21,6 +21,7 @@ The assessment's authority rests on its self-correction chain — *"nothing in t
| N-6 | *(new)* H-8 has a fourth instance, in the code | strengthens R-3 toward "incomplete flag set" |
| N-7 | G-8 "seventeen capability flags" | the real number is 28 of 32; G-8 grows |
| N-8 | G-1 / this §6 "the §5 experiment is unrun" | **it had been run twice, returning GO twice, on unmerged branches** — both unsound; Track A's job was re-scoped from *run it* to *run it soundly* |
| N-9 | N-3 / H-12 / R-14 / PR-4 "the gate drift was never intended" | **it was deliberated and reverted on 2026-07-25** (`50fa287d`); the parity pin already exists, one-directional by decision. PR-4's pin 1 is **withdrawn**; R-14's premise is corrected |
### N-1 · "No suite contains any `l10`/`always_on` test" is a scan artifact — the same artifact class caught twice before
@ -95,6 +96,28 @@ G-10 says curriculum SERVE is "fully blocked by one engineering item," the 16-pr
Two flags' own documentation asserts a production configuration the production configuration does not have. This is H-8's failure mode located inside the source, one layer below the documents, and it moves R-3's evidence decisively: F-6 reads as an **incomplete flag set**, not intended dormancy. Dormancy remains a coherent ruling — but it would now require correcting two docstrings that say otherwise.
### N-9 · The gate "drift" was a decision, and the pin this plan proposes was already written, tried, and reverted
*(Added 2026-07-28, while executing PR-4. It is the most consequential correction in this section because it **prevents work** rather than re-scoping it.)*
N-3 concluded the 23-vs-13 delta was unintended, on the strength of two in-repo comments asserting parity, and called that *"the strongest evidence available that the drift was never intended."* H-12 repeated it. R-14 built three options on it, recommending **A — raise CI to parity, +46s measured**. PR-4 specified a bidirectional parity pin as its first deliverable.
**All of that is answered by a third artifact none of them read.** `tests/test_cli_test_suites.py::test_cli_smoke_suite_covers_ci_smoke_gate` has enforced the surviving direction — `smoke.yml ⊆ TEST_SUITES["smoke"]` — since before this assessment began. (It is why the delta measures **CI-only = 0**: not luck, a pin.) Directly beneath its assertion sits a comment headed *"DELIBERATELY ONE-DIRECTIONAL — do not 'complete' this by also asserting `local_paths <= ci_paths`."*
Its history is `50fa287d`, **2026-07-25**: *"revert(tests): drop the local-to-CI smoke parity assertion — CI is not a gate."* An earlier agent read the same suite comment this plan read, drew the same inference, made the assertion symmetric, and reported the same class of file as drift. The revert's own words: *"That was wrong, and AGENTS.md says so in a line I had already read."*
**The governing line is `AGENTS.md:280`** — *"GitHub (`AssetOverflow/core`) is a **mirror only**; its Actions are billing-locked and produce dead signals — never chase them."* With §275279: local-first is the merge bar, `.github/workflows/*.yml` are *"secondary observability only,"* and the Forgejo host cannot run workflows either.
Three consequences:
1. **PR-4's pin 1 is withdrawn.** It exists in the only direction that protects anything, and the other direction has been tried and rejected with the reasoning recorded at the assertion site specifically to stop it being re-derived. This plan re-derived it anyway.
2. **R-14's premise is corrected.** Option A ("raise CI to parity, +46s on the runner's own hardware") spends 46s on a workflow that AGENTS.md says produces dead signals. The measurement was real; the thing measured does not gate.
3. **N-3's exposure claim was too generous to CI, and the real version is worse.** N-3 said *"CI is the only automatic check"* for a push that skipped the local gate. Under `AGENTS.md:280` there is **no automatic check at all** for such a push. The exposure is real and larger than stated — and it cannot be closed by editing `smoke.yml`. It is closed by the local gate being run, which is a hook-and-discipline question, not a workflow question.
**A fourth thing is genuinely open and is what PR-4 keeps:** the parity pin lives in the `fast` suite, and the pre-push gate runs `smoke` + `deductive` (`scripts/hooks/pre-push`, `scripts/ci/local-ci.sh --tier gate`). **The pin that guards the gate does not itself run on the gate.** That is cheap to fix and is real.
*(Two stale claims in the revert's own reasoning, noted for the record: it says pushing workflow changes "needs an OAuth scope the push credential lacks." This session pushed `smoke.yml` edits successfully in `98a6e8b4`. The constraint is not universal — though under §280 the edits buy observability, not gating.)*
### N-8 · The §5 experiment was not unrun — it had returned GO twice, on branches nobody merged
*(Added 2026-07-28, while executing Track A. It is the eighth correction, and like the other seven it came from reading code — here, a branch tip's commit message and the script under it.)*
@ -179,11 +202,16 @@ The assessment directory's own corrections (N-1…N-7 applied to `30-gap-registe
*Convert doctrine into failing tests. Every item here makes a guarantee mechanical that is currently maintained by attention.*
### PR-4 · Gate parity + curated-suite membership · **M** · G-7 + N-3 — **highest-leverage mechanical change in the repository**
Two pins in a CI-gated test file:
1. `smoke.yml`'s path set == `TEST_SUITES["smoke"]`, parsed from the workflow file — fails on drift in either direction.
2. Every `tests/**/test_*.py` is in ≥1 suite **excluding `full`**, or in `SUITE_EXCLUSIONS` with a one-line reason.
Then the remediation the pins demand: add the 10 missing files to `smoke.yml` (R-14, +46s measured) and assign every genuine orphan. **Verification:** each pin demonstrated red before green (delete a path from `smoke.yml`, confirm failure).
### PR-4 · Curated-suite membership ratchet · **M** · G-7 — **LANDED 2026-07-28, re-specified by N-9**
~~1. `smoke.yml`'s path set == `TEST_SUITES["smoke"]` — fails on drift in either direction.~~ **WITHDRAWN (N-9).** The surviving direction (`smoke.yml ⊆ TEST_SUITES["smoke"]`) has been pinned since before this assessment by `test_cli_smoke_suite_covers_ci_smoke_gate`; the symmetric version was written and reverted on 2026-07-25 (`50fa287d`) because `AGENTS.md:280` makes the workflows dead signals. This plan proposed re-adding exactly what a prior agent removed, with the reasoning recorded at the assertion site to prevent it.
**What landed instead:**
1. **Membership ratchet**`tests/test_suite_membership.py` + `tests/full_only_baseline.txt`. Measured: **749 of 877** test files belong to no curated suite. The plan's original mechanism ("assign every orphan, or write 749 exclusion reasons") is hollow at that scale — glob topic-suites would satisfy it while changing nothing about what executes, which is the Third-Door objection this plan itself levels at G-7's first formulation. All four demonstrated incidents (#113, #136, negation, speculative-lifecycle) were caused by a **newly landed** orphan, never a legacy one. So the ratchet blocks new orphans, enforces the baseline in **both** directions (a promoted or deleted file must leave the list), and pins the count so bulk movement is a reviewed decision.
2. **The gate-guarding pin now runs on the gate**`test_cli_test_suites.py` moved into `smoke`; it had lived in `fast`, which the pre-push gate does not run.
3. **The two false parity comments corrected** (R-14 option C's live half): `core/cli_test.py`'s audio block and `scripts/hooks/pre-push` step 1 both claimed an equality that has never held and twice sent readers hunting drift that is a design decision.
**Verification:** three sabotages, each observed red — a new unregistered test file, a stale baseline entry, and the parity pin demoted out of `smoke`. Remediation half (adding the ten to `smoke.yml`) is **not owed**: it buys observability, not gating.
### PR-5 · The flag-default register · **M** · G-8/H-6
`docs/specs/flag_register.md`: all **28** default-off flags plus the 4 default-on — current default, deliberate-posture vs accumulated-hesitancy, **what evidence flips it**, and named profiles (one-shot / eval / continuous-life) per R-4. Declared in the table, not the call site (ADR-0263 Rule 5). A pin asserts the register lists exactly the flags `core/config.py` defines — so a new flag cannot land unregistered. Includes the F-6 accrual resolution from R-3 and the N-6 docstring correction.

View file

@ -314,7 +314,21 @@ Two flags' documentation describes a production profile the production profile d
## R-14 · Gate parity — raise CI to the local suite, or lower the local suite to CI?
**Status:** PENDING · **Register:** N-3 / G-7 · **Blocks:** PR-4's remediation half (the pins themselves are unblocked).
**Status:** PENDING — but **substantially dissolved by N-9 (2026-07-28); read this box before ruling.** · **Register:** N-3 / G-7 / H-12 · **Blocks:** nothing that is still open.
> **The premise below is wrong, and the question is much smaller than it appears.**
>
> This ruling was drafted believing the 23-vs-13 delta was unintended drift. It is not. `tests/test_cli_test_suites.py::test_cli_smoke_suite_covers_ci_smoke_gate` already pins the one direction that protects anything (`smoke.yml ⊆ TEST_SUITES["smoke"]`), and carries a comment headed *"DELIBERATELY ONE-DIRECTIONAL."* Commit `50fa287d` (2026-07-25) added the symmetric assertion and **reverted it the same day**, recording the reasoning at the assertion site so it would not be re-derived. This packet re-derived it anyway.
>
> **Option A is the one that suffers.** Its "+46s measured on the runner's own hardware" is a real measurement of a workflow that `AGENTS.md:280` calls *"billing-locked … dead signals — never chase them"* and §277 calls *"secondary observability only."* Spending 46s there buys observability, not gating.
>
> **Option B is now clearly wrong**, not merely unattractive: lowering the local suite to match a file that gates nothing would delete real protection to satisfy a fiction.
>
> **Option C is close to what already exists** — the gates differ deliberately — leaving only its second half live: *correct the two comments that claim an equality that does not hold* (`core/cli_test.py`'s audio block; `scripts/hooks/pre-push`'s "exact CI-gate parity" line). That is a two-line docs fix needing no ruling.
>
> **What N-3 got right, and understated:** it named the exposure as "the push that skipped the local gate, for which CI is the only automatic check." Under §280 there is **no automatic check at all** for such a push. That is a real and larger exposure — and no edit to `smoke.yml` touches it. It is a hook-and-discipline question (is the pre-push hook installed on every machine and agent that pushes?), and it deserves its own entry rather than a parity ruling.
>
> **Recommendation, revised: rule C's comment-correction and close.** The remaining engineering — promoting the parity pin out of `fast` into the gate it guards — is mechanical, ruling-free, and landed 2026-07-28.
**The question.** `TEST_SUITES["smoke"]` = **23** files. `smoke.yml` = 8 patterns → **13** files. Ten files are on the local gate and not in CI.
@ -355,6 +369,6 @@ What is still wrong: **two independent places in the repository assert a parity
| R-11 | Interim fabrication gate | **B** measure the cost, then rule again | — |
| R-12 | Two ADR record amendments | **A/A** apply both drafted texts | PR-1 / H-8 |
| R-13 | Wilson re-count | **A** authorize, apply demotions, move the pin | PR-12, PR-14 |
| R-14 | Gate parity direction | **A** raise CI, +46s measured | PR-4 |
| R-14 | Gate parity direction | **dissolved by N-9** — rule C's comment-correction and close; the delta is designed, not drift | — |
*Fourteen questions. Every one has its evidence gathered, its options enumerated, and its consequent diff written. Nothing below Wave 0 branches on an unasked question once these are answered.*

View file

@ -2,7 +2,14 @@
# CORE local-first pre-push gate (weekly-audit T13, 2026-07-22).
#
# Automates the AGENTS.md §Local-First CI Validation Protocol "Pre-Push Gate":
# (1) the `smoke` suite — exact CI-gate parity,
# (1) the `smoke` suite — the merge bar itself, and a SUPERSET of the
# paths smoke.yml names (corrected 2026-07-28, N-9: this line used to
# read "exact CI-gate parity", which has never been true and is not the
# goal. AGENTS.md §277/§280 make the workflows secondary observability
# and GitHub Actions billing-locked dead signals, so this suite is the
# source and is deliberately broader. The invariant that IS enforced —
# smoke.yml never names a path this suite lacks — is pinned by
# tests/test_cli_test_suites.py::test_cli_smoke_suite_covers_ci_smoke_gate),
# (2) the warmed_session consistency lane pin — catches the T13
# telemetry-consistency regression class, which `smoke` does NOT cover
# (the #96 fail-closed resolve + #97 morph override escaped smoke and

View file

@ -0,0 +1,773 @@
# Curated-suite membership baseline (PR-4 / G-7, 2026-07-28).
#
# Every path below is a test file that belongs to NO curated suite in
# core/cli_test.py::TEST_SUITES other than `full` — i.e. it runs post-merge
# (full-pytest.yml / nightly) and on no pre-merge gate.
#
# THIS FILE IS A RATCHET, NOT A PERMISSION SLIP.
# tests/test_suite_membership.py fails when a test file lands outside every
# curated suite AND is not listed here. Registering a file in a curated suite
# requires DELETING its line here — the list may only shrink. A stale entry
# (file gone, or now curated) is a failure too, because a baseline that drifts
# is testimony rather than evidence.
#
# Why a baseline instead of assigning all of them: measured at 2026-07-28 there
# are 749 such files against 128 curated. The failure mode this pin exists to
# stop is the one demonstrated four times in-repo (#113 test_adr_index, #136,
# test_negation_survives_articulation, test_speculative_subject_lifecycle):
# a NEWLY LANDED pin, unregistered, running nowhere before merge. None of the
# 749 legacy files caused those. Sweeping them into glob-defined topic suites
# would satisfy a membership assertion while changing nothing about what runs —
# a hollow gate by the Third-Door criterion, which is exactly the objection the
# execution plan raises against G-7's originally-specified mechanism.
#
# Shrinking this list is real work with real value. Doing it in bulk is not.
tests/formation/test_cache.py
tests/formation/test_compiler_runner.py
tests/formation/test_compose.py
tests/formation/test_course_dataclasses.py
tests/formation/test_forge.py
tests/formation/test_hashing.py
tests/formation/test_mastery.py
tests/formation/test_micro_course.py
tests/formation/test_promote.py
tests/formation/test_ratify.py
tests/formation/test_smelter.py
tests/formation/test_template_composed_relation.py
tests/formation/test_template_falsification.py
tests/formation/test_template_identity_anchor.py
tests/formation/test_template_procedural.py
tests/formation/test_template_registry.py
tests/test_3lang_depth_capability.py
tests/test_admissibility_exemplars.py
tests/test_admissibility_replay_gate.py
tests/test_admissibility_trace.py
tests/test_adr_0084_definitional_substrate.py
tests/test_adr_0084_integration_closure.py
tests/test_adr_0085_gloss_aware_cause.py
tests/test_adr_0087_procedure_selector.py
tests/test_adr_0087_rhetorical_style_substrate.py
tests/test_adr_0097_mathematics_logic_ratification.py
tests/test_adr_0100_0102_sibling_ratifications.py
tests/test_adr_0110_math_expert_demo.py
tests/test_adr_0111_physics_expert_demo.py
tests/test_adr_0114a_10_pack_provenance.py
tests/test_adr_0114a_2_ood_ratio.py
tests/test_adr_0114a_5_perturbation.py
tests/test_adr_0114a_6_depth_curve.py
tests/test_adr_0114a_8_adversarial.py
tests/test_adr_0119_1_sealed_holdout.py
tests/test_adr_0119_4_frontier_baseline.py
tests/test_adr_0119_5_adversarial.py
tests/test_adr_0119_6_depth_curve.py
tests/test_adr_0119_7_sealed_gsm8k.py
tests/test_adr_0119_8_lane_gate.py
tests/test_adr_0120_math_expert_promotion.py
tests/test_adr_0121_math_expert_deferred.py
tests/test_adr_0122_deferral.py
tests/test_adr_0122_rate_per_unit.py
tests/test_adr_0123_comparison_phrasing.py
tests/test_adr_0124_systems_software_audit_passed.py
tests/test_adr_0126_runner_wiring.py
tests/test_adr_0127_loader.py
tests/test_adr_0128_loader.py
tests/test_adr_0128_numeric_formats.py
tests/test_adr_0128_pack_ratification.py
tests/test_adr_0131_1_F_frontier.py
tests/test_adr_0131_1_sealed_holdout.py
tests/test_adr_0131_1_symbolic_equivalence_lane.py
tests/test_adr_0131_2_teaching_corpus_lane.py
tests/test_adr_0131_3_bounded_grammar_lane.py
tests/test_adr_0131_4_composite_math_gate.py
tests/test_adr_0131_G1_verb_classes.py
tests/test_adr_0131_G2_comparatives.py
tests/test_adr_0131_G2a_comparative_verb_widening.py
tests/test_adr_0131_G31_numerics_extensions.py
tests/test_adr_0131_G3_numerics.py
tests/test_adr_0131_G4_multi_clause.py
tests/test_adr_0131_G5_aggregate.py
tests/test_adr_0131_G_gsm8k_coverage_probe.py
tests/test_adr_0136_S1_rate_events.py
tests/test_adr_0136_S2_conditional_op.py
tests/test_adr_0136_S3_compound_initial_mutation.py
tests/test_adr_0136_S4_novel_initial_form.py
tests/test_adr_0145_energy_modulated_surface.py
tests/test_adr_0146_engine_state.py
tests/test_adr_0148_vault_promotion.py
tests/test_adr_0149_recognizer_pipeline_wiring.py
tests/test_adr_0150_autonomous_contemplation.py
tests/test_adr_0151_auto_proposal.py
tests/test_adr_0153_trace_hash_backstamp.py
tests/test_adr_0154_recognizer_producer_wiring.py
tests/test_adr_0156_atomic_checkpoint.py
tests/test_adr_0157_revision_mismatch_warning.py
tests/test_adr_0158_reboot_event.py
tests/test_adr_0163_d2_discrete_count_injection.py
tests/test_adr_0163_d3_conditional_prefix.py
tests/test_adr_0163_d4_question_grammar.py
tests/test_adr_0163_f2_confusers.py
tests/test_adr_0170_w1_injector_type_widening.py
tests/test_adr_0170_w2_dcs_acquisition_verbs.py
tests/test_adr_0172_w0_1_trace_replay_equivalence.py
tests/test_adr_0172_w0_reasoning_trace.py
tests/test_adr_0172_w1_shape_proposal.py
tests/test_adr_0172_w3_cli_lane.py
tests/test_adr_0172_w4_workbench_e2e.py
tests/test_adr_0174_phase1_held_hypothesis_state.py
tests/test_adr_0174_phase2_constraint_propagation.py
tests/test_adr_0174_phase3_lookback.py
tests/test_adr_0174_phase3b_compound_clause.py
tests/test_adr_0174_phase4_contemplate.py
tests/test_adr_0175_phase1_reliability_gate.py
tests/test_adr_0175_phase2_practice_lane.py
tests/test_adr_0175_phase3a_selfverify_gate.py
tests/test_adr_0175_phase3b_mult_search.py
tests/test_adr_0175_propose.py
tests/test_adr_0175_propose_runner.py
tests/test_adr_0176_comparatives_pack.py
tests/test_adr_0176_ms1_question_target.py
tests/test_adr_0176_ms2_chain.py
tests/test_adr_0176_ms3_search.py
tests/test_adr_0177_cp1_ledger.py
tests/test_adr_0177_cp2a_training.py
tests/test_adr_0178_gb1_clauses.py
tests/test_adr_0178_gb2_compose.py
tests/test_adr_0178_gb3_referent_guard.py
tests/test_adr_0178_gb3b1_accumulation.py
tests/test_adr_0179_ex2_decimal_grounding.py
tests/test_adr_0179_extract.py
tests/test_adr_0180_crdt_foundation.py
tests/test_adr_0182_pool.py
tests/test_adr_0184_distinct_unit_product.py
tests/test_adr_0184_s1_semantic_state_helpers.py
tests/test_adr_0184_s2_semantic_ledger.py
tests/test_adr_0184_s4_semantic_candidate_source.py
tests/test_adr_0184_s4b_replay_equivalence.py
tests/test_adr_0186_sealed_injector_lane.py
tests/test_adr_0189a_day_enum_activity.py
tests/test_adr_0195_product_bridge.py
tests/test_adr_0199_learning_arena_engine.py
tests/test_adr_0206_math_serving_seam.py
tests/test_adr_0218_proof_promotion.py
tests/test_adr_0219_generation_checkpoint.py
tests/test_adr_0238_goldtether.py
tests/test_adr_0238_goldtether_alpha.py
tests/test_adr_0238_goldtether_bootstrap_prune.py
tests/test_adr_0239_dynamic_manifold.py
tests/test_adr_0239_surprise_dual.py
tests/test_adr_0239_surprise_metric_projection.py
tests/test_adr_0240_analogical_transfer.py
tests/test_adr_0240_biography_holonomy.py
tests/test_adr_0240_biography_session.py
tests/test_adr_0240_temporal_and_miner.py
tests/test_adr_0241_governance_p12.py
tests/test_adr_0241_holographic_vault.py
tests/test_adr_0241_sensorium_wave_feed.py
tests/test_adr_0241_wave_contemplation_seam.py
tests/test_adr_0241_wave_energy_boundary.py
tests/test_adr_0241_wave_manifold.py
tests/test_adr_0242_atlas_packing.py
tests/test_adr_0242_carry_seams.py
tests/test_adr_0242_fibonacci.py
tests/test_adr_0242_fibonacci_word.py
tests/test_adr_0242_multi_scale_energy.py
tests/test_adr_0242_topological_quarantine.py
tests/test_adr_0243_benchmark.py
tests/test_adr_0243_biography_wiring.py
tests/test_adr_0243_cognitive_lifecycle.py
tests/test_adr_0243_lane_a_discovery_wiring.py
tests/test_adr_0243_lane_a_kappa_calibration.py
tests/test_adr_0243_linguistic_readback.py
tests/test_adr_0243_propositional_falsifier.py
tests/test_adr_0243_sensorium_corridor.py
tests/test_adr_0243_sketch_defect_pins.py
tests/test_adr_0243_tether_wiring.py
tests/test_adr_0244_gamma_calibration.py
tests/test_adr_0244_identity_gate_eval.py
tests/test_adr_0244_identity_gate_runtime.py
tests/test_adr_0244_identity_gate_wave.py
tests/test_adr_0244_identity_manifold.py
tests/test_adr_0244_mechanical_sympathy.py
tests/test_adr_0244_mode_order_independence.py
tests/test_adr_0244_qtop_vacuity.py
tests/test_adr_0244_scheduler_quasiperiodicity.py
tests/test_adr_0244_search_honesty.py
tests/test_adr_0244_semantic_rigor.py
tests/test_adr_0244_serving_cast.py
tests/test_adr_0245_acceptance_gate.py
tests/test_adr_0246_action_record.py
tests/test_adr_0246_admission.py
tests/test_adr_0246_egress_wiring.py
tests/test_adr_0246_geometric_suite.py
tests/test_adr_0246_grounding_feasibility.py
tests/test_adr_0246_induced_action.py
tests/test_adr_0246_mismatch_diagnostic.py
tests/test_adr_0246_path_ledger.py
tests/test_adr_0246_path_serve_integration.py
tests/test_adr_0249_arithmetic_lift.py
tests/test_adr_0249_logic_cnf_compiler.py
tests/test_adr_0249_quantity_kernel.py
tests/test_adr_0249_relation_compiler.py
tests/test_adr_0249_turn_program.py
tests/test_adr_0250_compare.py
tests/test_adr_0250_multi_register.py
tests/test_adr_0250_q_difference_failclosed.py
tests/test_adr_0250_summation.py
tests/test_adr_0252_s5_blindness.py
tests/test_aggregate_total_question_forms.py
tests/test_alignment_graph.py
tests/test_ambiguity_hazards.py
tests/test_anaphora.py
tests/test_anchor_lens_cli.py
tests/test_anchor_lens_engagement_unit.py
tests/test_anchor_lens_lifts_proposition.py
tests/test_anchor_lens_no_glyph_leak.py
tests/test_anchor_lens_null_lift.py
tests/test_anchor_lens_pack_loader.py
tests/test_anchor_lens_pack_seam.py
tests/test_anchor_lens_telemetry.py
tests/test_anchor_lens_tour_demo.py
tests/test_answer_choices.py
tests/test_anti_regression_demo.py
tests/test_apple_uma_demo_package.py
tests/test_apple_uma_mechanical_sympathy_benchmark.py
tests/test_apple_uma_mlx_exact_recall.py
tests/test_array_codec.py
tests/test_articulation.py
tests/test_articulation_bench.py
tests/test_articulation_demo.py
tests/test_articulation_legality.py
tests/test_articulation_quality_e2e.py
tests/test_articulation_quality_miner.py
tests/test_ask_acquisition.py
tests/test_ask_handle.py
tests/test_ask_pass_manager_delivery.py
tests/test_ask_runtime_helper.py
tests/test_ask_serving_gate.py
tests/test_ask_serving_integration.py
tests/test_audit_tour.py
tests/test_binding_graph_acyclicity.py
tests/test_binding_graph_adapter.py
tests/test_binding_graph_adapter_question_target.py
tests/test_binding_graph_adapter_units.py
tests/test_binding_graph_admissibility.py
tests/test_binding_graph_model.py
tests/test_binding_graph_question_target.py
tests/test_binding_graph_units.py
tests/test_brief_11_audit.py
tests/test_brief_11b_audit_artifact.py
tests/test_brief_11b_step2_lexicon.py
tests/test_brief_11b_step2_verb_classification.py
tests/test_candidate_domain_partition.py
tests/test_candidate_graph_completeness_guard.py
tests/test_candidate_graph_recognizer_wiring.py
tests/test_candidate_operator.py
tests/test_candidate_operator_quantity_entity_binding.py
tests/test_capability_baseline.py
tests/test_capability_cli.py
tests/test_capability_index.py
tests/test_capability_reports.py
tests/test_cga_f64_exactness.py
tests/test_cga_incidence.py
tests/test_cga_rust_surface_parity.py
tests/test_chiral_orientation_gate.py
tests/test_claims_md_is_current.py
tests/test_claude_hybrid_verification_demo.py
tests/test_claude_tool_authority_demo.py
tests/test_cli.py
tests/test_cli_demo.py
tests/test_cli_ingest.py
tests/test_cli_pack_validate_security.py
tests/test_cmb_router_contemplation.py
tests/test_cognition_eval_register_matrix.py
tests/test_cognition_leeway.py
tests/test_cold_start_grounding_lane.py
tests/test_comb_pass_hot_path.py
tests/test_combined_rate_oracle.py
tests/test_combined_rate_reader.py
tests/test_combined_rate_solver.py
tests/test_compiler.py
tests/test_composed_surface.py
tests/test_composer_graph_atom_equivalence.py
tests/test_composition_lower_logic.py
tests/test_composition_lower_transitive.py
tests/test_composition_validation_corpus.py
tests/test_compound_intent.py
tests/test_compound_intent_substrate.py
tests/test_compound_walkthrough_eval_lanes.py
tests/test_comprehension_attempt.py
tests/test_comprehension_contemplation.py
tests/test_comprehension_propositional.py
tests/test_comprehension_reader.py
tests/test_comprehension_relational_metric.py
tests/test_comprehension_set_membership.py
tests/test_comprehension_state.py
tests/test_comprehension_structure_preserving.py
tests/test_comprehension_syllogism.py
tests/test_comprehension_total_ordering.py
tests/test_comprehension_wrong_zero_property.py
tests/test_compute_budget.py
tests/test_conftest_engine_state_isolation.py
tests/test_constraint_comprehension_model.py
tests/test_constraint_oracle.py
tests/test_constraint_reader.py
tests/test_constraint_solver.py
tests/test_construction_affordances.py
tests/test_construction_proposal_seam.py
tests/test_contemplation.py
tests/test_contemplation_loop.py
tests/test_contemplation_pipeline_convergence.py
tests/test_contemplation_quality_lane.py
tests/test_contemplation_ratifiable_payload.py
tests/test_contemplation_wiring.py
tests/test_continuous_learning_idle.py
tests/test_contract_residuals.py
tests/test_conversation_demo.py
tests/test_core_ingest.py
tests/test_core_trace_protocol.py
tests/test_correction_cue_prefix_routing.py
tests/test_correction_telemetry.py
tests/test_correction_topic_lemma.py
tests/test_crdt_content_ordering.py
tests/test_crdt_no_global_write_from_arena.py
tests/test_crdt_semilattice_contract.py
tests/test_cross_pack_chains.py
tests/test_cross_pack_grounding.py
tests/test_cross_pack_supersede.py
tests/test_cross_serving_gates.py
tests/test_curriculum_proposals.py
tests/test_deduction_surface.py
tests/test_deductive_entailment_authority_demo.py
tests/test_deductive_logic_finite_entity_grounding.py
tests/test_deductive_logic_relational_grounding.py
tests/test_delta_store_frontier_isolation.py
tests/test_demo_composition.py
tests/test_derived_close_proposals.py
tests/test_determination_closure_lane.py
tests/test_determination_consolidation.py
tests/test_determination_estimation_lane.py
tests/test_determination_surface.py
tests/test_determine_d0.py
tests/test_determine_relational_inference.py
tests/test_determine_relational_transitive.py
tests/test_determine_transitive.py
tests/test_determinism_proofs.py
tests/test_deterministic_fluency_lane.py
tests/test_dialogue.py
tests/test_dialogue_fluency_regression.py
tests/test_dimensional_reasoning_lane.py
tests/test_disclosure_claim.py
tests/test_discourse_planner_behavior.py
tests/test_discourse_planner_compound.py
tests/test_discourse_planner_contract.py
tests/test_discourse_planner_helper.py
tests/test_discourse_planner_reflective.py
tests/test_discourse_planner_render.py
tests/test_discourse_planner_walkthrough.py
tests/test_discovery_candidates.py
tests/test_discovery_contemplation_vault_probe.py
tests/test_discovery_yield.py
tests/test_discrete_count_open_noun_class.py
tests/test_dispatch_trace.py
tests/test_domain_contract_predicates.py
tests/test_domain_pack_contract.py
tests/test_edge_budget_gate.py
tests/test_edge_sync_activation.py
tests/test_edge_sync_artifact_contract.py
tests/test_edge_sync_hot_path_imports.py
tests/test_edge_sync_journal.py
tests/test_edge_sync_manifest.py
tests/test_edge_sync_s3_store.py
tests/test_en_collapse_anchors_v1_pack.py
tests/test_en_core_action_v1_pack.py
tests/test_en_core_attitude_v1_pack.py
tests/test_en_core_causation_v1_pack.py
tests/test_en_core_math_v1_pack.py
tests/test_en_core_meta_v1_pack.py
tests/test_en_core_polarity_v1_pack.py
tests/test_en_core_quantitative_v1_pack.py
tests/test_en_core_relations_v1_pack.py
tests/test_en_core_relations_v2_pack.py
tests/test_en_core_spatial_v1_pack.py
tests/test_en_core_syntax_v1_pack.py
tests/test_en_core_temporal_v1_pack.py
tests/test_engine_identity.py
tests/test_engine_identity_lineage.py
tests/test_engine_loop_proof.py
tests/test_engine_state_session_persistence.py
tests/test_epistemic_carrier.py
tests/test_epistemic_phase2_known_bugs.py
tests/test_epistemic_phase3_state_tagging.py
tests/test_epistemic_question_render.py
tests/test_epistemic_truth_state_demo.py
tests/test_ethics_check.py
tests/test_ethics_packs.py
tests/test_ethics_refusal_opt_in.py
tests/test_eval_cli_failure_printer.py
tests/test_eval_holdout_split.py
tests/test_exemplar_ingest.py
tests/test_expert_demo_contract.py
tests/test_expert_demo_runnable.py
tests/test_explain.py
tests/test_explain_repl.py
tests/test_fabrication_control_runner.py
tests/test_failure_family.py
tests/test_failure_proposal.py
tests/test_fieldstate_codec.py
tests/test_forward_graph_constraint_null_lift.py
tests/test_forward_graph_constraint_wiring.py
tests/test_forward_semantic_control.py
tests/test_foundational_families.py
tests/test_frame_verdict.py
tests/test_frame_verdict_perception_adapter.py
tests/test_frame_verdict_text_cwa_lane.py
tests/test_frontier_compare_cross_provider.py
tests/test_frontier_compare_wave1.py
tests/test_frontier_model_registry_pricing.py
tests/test_generalization_audit_runner.py
tests/test_generalization_cache_verifier.py
tests/test_generalization_gsm1k_adapter.py
tests/test_generalization_manifest_policy.py
tests/test_generalized_lift_instrument.py
tests/test_generate_stream.py
tests/test_geometric_product_f64_parity.py
tests/test_geometric_search_run.py
tests/test_graph_constraint.py
tests/test_graph_topo_order_perf.py
tests/test_grounded_open_hedge_arm.py
tests/test_grounding_accessors.py
tests/test_grounding_source_characterization.py
tests/test_gsm8k_experience_flywheel.py
tests/test_gsm8k_experience_flywheel_review_patch.py
tests/test_gsm8k_frontier_report.py
tests/test_gsm8k_math_runner.py
tests/test_gsm8k_morphology_missing_kernel_labels.py
tests/test_gsm8k_post_gate_a1_frontier_microscope.py
tests/test_gsm8k_problem_frame_adequacy.py
tests/test_gsm8k_r1_reconstruction.py
tests/test_gsm8k_sealed_attempt_scout.py
tests/test_hedge_injection.py
tests/test_hitl_queue_backpressure.py
tests/test_hitl_queue_submission_invariants.py
tests/test_holdout_dev_lane.py
tests/test_holdout_encryption.py
tests/test_identity_continuity_proof.py
tests/test_identity_continuity_verification.py
tests/test_identity_gate.py
tests/test_identity_packs.py
tests/test_identity_provenance_split.py
tests/test_identity_score_decomposition.py
tests/test_identity_surface_divergence.py
tests/test_identity_surface_divergence_depth.py
tests/test_idle_backpressure_telemetry.py
tests/test_idle_frontier_contemplation.py
tests/test_idle_proposal_review.py
tests/test_inference_operators.py
tests/test_inline_realization.py
tests/test_inner_loop_exhaustion_materializes.py
tests/test_intent_classification_extensions.py
tests/test_intent_explain_paragraph.py
tests/test_intent_ratifier.py
tests/test_intent_subject_extraction.py
tests/test_intent_subject_normalization_consistency.py
tests/test_issue_300_versor_margin.py
tests/test_kernel_facts.py
tests/test_kernel_no_new_legacy_derivation_surfaces.py
tests/test_l10_always_on.py
tests/test_l10_always_on_daemon.py
tests/test_l10_always_on_soak.py
tests/test_l10_arbitrary_interruption.py
tests/test_l10_continuity.py
tests/test_labeled_container_subject.py
tests/test_lane_sha_verifier.py
tests/test_lane_shape_thresholds.py
tests/test_language_pack_cache.py
tests/test_language_pack_load_safety.py
tests/test_language_pack_runtime.py
tests/test_language_packs_scalar_equivalence.py
tests/test_language_packs_unit_dimensions.py
tests/test_learning_arc_demo.py
tests/test_learning_loop_demo.py
tests/test_lexeme_primitives.py
tests/test_lexicon.py
tests/test_limitation_assessment.py
tests/test_linguistic_governance_phases.py
tests/test_logic_canonical.py
tests/test_long_context_comparison.py
tests/test_manifold.py
tests/test_manifold_state.py
tests/test_math_candidate_graph.py
tests/test_math_candidate_graph_container_of_product.py
tests/test_math_candidate_graph_fraction_portion.py
tests/test_math_candidate_graph_goal_residual_lift.py
tests/test_math_candidate_graph_peer_partition_question.py
tests/test_math_candidate_graph_question_bound_product_lift.py
tests/test_math_candidate_graph_rate_injection.py
tests/test_math_candidate_graph_sprint10_frontier_lift.py
tests/test_math_candidate_graph_sprint10_review_patch.py
tests/test_math_candidate_graph_sprint11_cluster_contract_lift.py
tests/test_math_candidate_graph_sprint11_review_patch.py
tests/test_math_candidate_graph_sprint12_singleton_contract_lift.py
tests/test_math_candidate_graph_sprint6_experience_guided_lift.py
tests/test_math_candidate_graph_sprint6_review_patch.py
tests/test_math_candidate_graph_sprint7_experience_guided_lift.py
tests/test_math_candidate_graph_sprint7_owner_binding.py
tests/test_math_candidate_graph_sprint8_r6_affine_lift.py
tests/test_math_candidate_graph_sprint8_review_patch.py
tests/test_math_candidate_graph_sprint9_postmerge_hardening.py
tests/test_math_candidate_graph_sprint9_temporal_affine_lift.py
tests/test_math_candidate_graph_unit_partition_injection.py
tests/test_math_candidate_graph_xhigh_sprint13_lift.py
tests/test_math_candidate_parser.py
tests/test_math_claim_signature.py
tests/test_math_contemplation_adapter.py
tests/test_math_evidence_e2e.py
tests/test_math_evidence_schema.py
tests/test_math_lexical_ratification.py
tests/test_math_parser.py
tests/test_math_problem_graph.py
tests/test_math_realizer.py
tests/test_math_roundtrip.py
tests/test_math_solver.py
tests/test_math_symbolic_equivalence.py
tests/test_math_symbolic_normalizer.py
tests/test_math_verifier.py
tests/test_mathlogic_expert_ledger_flip.py
tests/test_meaning_graph.py
tests/test_meaning_graph_projectors.py
tests/test_medical_clinical_ethics_pack.py
tests/test_miner_proposals.py
tests/test_morphology_registry.py
tests/test_multi_sentence_response_eval.py
tests/test_mutation_proposal_type.py
tests/test_narrative_example_intents.py
tests/test_no_assessment_backed_proposal_synthesis.py
tests/test_null_point_primitives.py
tests/test_observed_he_morph_constraint_v0.py
tests/test_ood_surface_generator.py
tests/test_oov_grounding_cache.py
tests/test_oov_pipeline.py
tests/test_oov_surface.py
tests/test_operator_calibration_replay.py
tests/test_orthogonality_tour_demo.py
tests/test_pack_glosses_content.py
tests/test_pack_grounded_comparison.py
tests/test_pack_grounded_correction.py
tests/test_pack_grounded_unknown.py
tests/test_pack_grounding.py
tests/test_pack_resolver.py
tests/test_pack_resolver_glosses.py
tests/test_partial_surface.py
tests/test_percent_partition_proposal.py
tests/test_perturbation_suite.py
tests/test_phase_d_replay_evidence.py
tests/test_physics_backend_dispatch_hygiene.py
tests/test_pipeline.py
tests/test_plan_contemplation.py
tests/test_plan_contemplation_runtime.py
tests/test_plan_metrics.py
tests/test_plan_metrics_runtime.py
tests/test_probe_repl.py
tests/test_problem_frame_builder.py
tests/test_problem_frame_contracts.py
tests/test_problem_frame_phase_boundaries.py
tests/test_problem_frame_skeleton.py
tests/test_procedure_surface.py
tests/test_process_frames.py
tests/test_prompt_diversity_runner.py
tests/test_proof_carrying_promotion_demo.py
tests/test_proof_carrying_promotion_obligations.py
tests/test_proof_chain_builder.py
tests/test_proof_chain_certificate.py
tests/test_proof_chain_rules.py
tests/test_proofwriter_owa_lane.py
tests/test_proper_noun_primitive_universality.py
tests/test_proportional_decrease_proposal.py
tests/test_proposal_review_report.py
tests/test_proposal_review_safety.py
tests/test_proposal_review_scan.py
tests/test_proposal_review_summary.py
tests/test_proposal_source.py
tests/test_propose_from_exemplars_cli.py
tests/test_proposition.py
tests/test_provenance.py
tests/test_public_showcase.py
tests/test_quantitative_comprehension.py
tests/test_quantitative_expr.py
tests/test_quantity_entity_proposal.py
tests/test_question_delivery.py
tests/test_r3_router_contemplation.py
tests/test_r4_goal_residual.py
tests/test_rate_conversion.py
tests/test_rate_conversion_solving.py
tests/test_rate_oracle.py
tests/test_rate_reader.py
tests/test_rate_solver.py
tests/test_rate_units.py
tests/test_ratification_threshold_default.py
tests/test_reader_phase2.py
tests/test_reader_question_frame.py
tests/test_realize_oov.py
tests/test_realize_r0.py
tests/test_realize_r1_structural.py
tests/test_realize_r1c_binding_graph.py
tests/test_realizer_grounded_authority_flag.py
tests/test_realizer_guard_holdout.py
tests/test_realizer_guard_runtime_seam.py
tests/test_realizer_guard_unit.py
tests/test_reasoning_evidence.py
tests/test_recognition_phase1.py
tests/test_recognition_phase2.py
tests/test_recognition_refusal_propagates.py
tests/test_recognizer_anchor_inject.py
tests/test_recognizer_comparative_inject.py
tests/test_recognizer_match.py
tests/test_recognizer_registry.py
tests/test_recognizer_skip_wrong_zero.py
tests/test_recognizer_synthesis.py
tests/test_recognizer_unit_partition_inject.py
tests/test_refusal_taxonomy_lane.py
tests/test_register_cli.py
tests/test_register_firing_diagnostic.py
tests/test_register_invariant_grounding.py
tests/test_register_layering_separation.py
tests/test_register_null_lift.py
tests/test_register_pack_convivial_v1.py
tests/test_register_pack_loader.py
tests/test_register_pack_seam.py
tests/test_register_pack_terse_v1.py
tests/test_register_runtime_threading.py
tests/test_register_telemetry.py
tests/test_register_tour_demo.py
tests/test_register_tour_gate_strengthening.py
tests/test_register_variation.py
tests/test_relational_ablation.py
tests/test_relational_field_reader.py
tests/test_relational_finite_verb.py
tests/test_relational_inference_lane.py
tests/test_relational_metric_lane.py
tests/test_relational_operator_ablation.py
tests/test_relational_predicate_lane.py
tests/test_relational_reader.py
tests/test_relational_symbolic_reader.py
tests/test_relational_transitive_lane.py
tests/test_relations_chains_v1.py
tests/test_relations_pack_v1_extensions.py
tests/test_replay_adapter.py
tests/test_replay_adapter_bound_attempt.py
tests/test_repository_hygiene.py
tests/test_rescan_v2_invariants.py
tests/test_rescan_v3_invariants.py
tests/test_response_governance.py
tests/test_response_governance_frame_verdict.py
tests/test_response_mode_classifier.py
tests/test_reviewer_registry.py
tests/test_ring2_residual_protocol.py
tests/test_ring3_integrity_handoff.py
tests/test_rotor_power.py
tests/test_rotor_power_general.py
tests/test_router_organ_hygiene.py
tests/test_run_attempt_binding.py
tests/test_runtime_config_passthrough.py
tests/test_runtime_config_register.py
tests/test_rust_backend.py
tests/test_rust_scalar_zero_copy_boundary.py
tests/test_safe_display.py
tests/test_safety_check.py
tests/test_safety_pack.py
tests/test_safety_refusal.py
tests/test_salience.py
tests/test_salience_vectorize_parity.py
tests/test_sealed_practice_trace.py
tests/test_sealed_practice_trace_bound_episode.py
tests/test_search_gate.py
tests/test_segmenter.py
tests/test_sensorium_efferent_decode.py
tests/test_sensorium_eval_report.py
tests/test_sensorium_mount.py
tests/test_serve_quarantine_transitive.py
tests/test_served_disposition.py
tests/test_session_context_codec.py
tests/test_setup_oracle.py
tests/test_setup_router.py
tests/test_stage3_epistemic_inductive.py
tests/test_stage3_oov_egress_authority.py
tests/test_stage3_root_ambiguity.py
tests/test_staged_gold_lanes.py
tests/test_stop_tokens_override.py
tests/test_supersede.py
tests/test_supersession_history.py
tests/test_surface.py
tests/test_surface_resolution.py
tests/test_teaching_audit.py
tests/test_teaching_gaps.py
tests/test_teaching_grounding.py
tests/test_teaching_loop_bench.py
tests/test_teaching_promotion.py
tests/test_teaching_proposals.py
tests/test_teaching_propose_cli.py
tests/test_teaching_queue.py
tests/test_telemetry_fanout_and_summary.py
tests/test_telemetry_sink.py
tests/test_third_door_adr_dag_embedding.py
tests/test_third_door_blueprint_fidelity.py
tests/test_third_door_cohesion.py
tests/test_third_door_surprise_discovery_wiring.py
tests/test_third_door_trajectory_invariants.py
tests/test_thread_context.py
tests/test_trackb_inc2_structure_mapping.py
tests/test_trackb_s1_structure_mapping.py
tests/test_transition_rotor.py
tests/test_transitive_surface.py
tests/test_turn_loop_verdicts.py
tests/test_turn_verdicts_bundle.py
tests/test_unary_delta_proposal.py
tests/test_unified_ingest_null_lift.py
tests/test_unknown_token_ingest.py
tests/test_vault_config.py
tests/test_vault_recall_indexing_batch.py
tests/test_vault_recall_rethaw.py
tests/test_vault_store.py
tests/test_vaultstore_codec.py
tests/test_verified_contract.py
tests/test_verified_r2_producer.py
tests/test_verified_serving_gate.py
tests/test_vocab_manifold_invariants.py
tests/test_warmed_session_lane.py
tests/test_workbench_api.py
tests/test_workbench_apple_uma_report.py
tests/test_workbench_calibration.py
tests/test_workbench_chat_turn.py
tests/test_workbench_construction_endpoint.py
tests/test_workbench_construction_evidence.py
tests/test_workbench_contemplation_reader.py
tests/test_workbench_demo_narrative.py
tests/test_workbench_demos.py
tests/test_workbench_evidence_bundle.py
tests/test_workbench_field_evidence.py
tests/test_workbench_generalization_evidence.py
tests/test_workbench_journal.py
tests/test_workbench_leeway_mapping.py
tests/test_workbench_lived_life.py
tests/test_workbench_logos.py
tests/test_workbench_operator_telemetry.py
tests/test_workbench_pipeline_record.py
tests/test_workbench_practice_api.py
tests/test_workbench_practice_evidence.py
tests/test_workbench_proposal_artifact.py
tests/test_workbench_r2_read_substrate.py
tests/test_workbench_ratify_case_0050_hazard_pin.py
tests/test_workbench_ratify_category_allowlist.py
tests/test_workbench_ratify_composition.py
tests/test_workbench_ratify_cors.py
tests/test_workbench_ratify_exception_surface.py
tests/test_workbench_ratify_frame.py
tests/test_workbench_ratify_idempotent.py
tests/test_workbench_ratify_lexical.py
tests/test_workbench_ratify_no_auto.py
tests/test_workbench_ratify_partition.py
tests/test_workbench_readers.py
tests/test_workbench_replay.py
tests/test_workbench_schemas.py
tests/test_workbench_tour.py
tests/test_workbench_vault_recall_evidence.py

View file

@ -0,0 +1,183 @@
"""PR-4 / G-7 — a test file may not land outside every curated suite.
The failure mode, demonstrated four times in this repository: a pin is written
for a real defect, lands in no curated suite, therefore runs on no pre-merge
gate, and the thing it pins regresses anyway. #113 (``test_adr_index``), #136,
``test_negation_survives_articulation``, and while fixing H-13 on 2026-07-28
``test_speculative_subject_lifecycle``, which pinned the exact behavior that
had silently broken. Each was repaired individually, after shipping.
**Why this is a ratchet and not a membership assertion.** The plan originally
specified "every ``tests/**/test_*.py`` belongs to >=1 suite excluding ``full``,
or to a registered exclusion list with a reason." Measured at 2026-07-28 that is
749 files against 128 curated. Both ways of satisfying it at that scale are
hollow: glob-defined topic suites (``"adr": ("tests/test_adr_*.py",)`` alone
absorbs 172) make the assertion pass while changing nothing about what executes,
and 749 hand-written exclusion reasons are ceremony. A curated suite nobody runs
is the same non-guarantee as ``full``, wearing a different name which is the
objection the plan itself raises against G-7's first formulation.
None of the 749 legacy files caused any of the four incidents. A *new* orphan
caused all four. So the pin with teeth is the one that blocks new orphans and
makes the legacy set a declared, monotonically shrinking number.
Recorded as N-9 in ``docs/assessment/50-execution-plan.md``.
"""
from __future__ import annotations
import ast
import glob
import re
from pathlib import Path
import pytest
_ROOT = Path(__file__).resolve().parents[1]
_BASELINE = _ROOT / "tests" / "full_only_baseline.txt"
def _curated_files() -> set[str]:
"""Every test path reachable from a curated suite other than ``full``.
``TEST_SUITES`` is parsed from source rather than imported so this pin keeps
working if importing the CLI ever acquires a side effect; the tuple is a
literal by construction (``test_cli_test_suites.py`` pins its shape).
"""
src = (_ROOT / "core" / "cli_test.py").read_text(encoding="utf-8")
match = re.search(r"TEST_SUITES\s*(?::[^=]+)?=\s*\{", src)
assert match is not None, "TEST_SUITES literal not found in core/cli_test.py"
start = match.end() - 1
depth = 0
end = len(src)
for i, ch in enumerate(src[start:], start):
if ch == "{":
depth += 1
elif ch == "}":
depth -= 1
if depth == 0:
end = i + 1
break
suites = ast.literal_eval(src[start:end])
curated: set[str] = set()
for name, patterns in suites.items():
if name == "full":
# ``full`` is ("tests/",) — a DIRECTORY, so it matches every test
# file trivially. Counting it would make this pin vacuous; that
# scan artifact is N-1 in the execution plan and has now produced
# three false conclusions in this repository.
continue
for pattern in patterns:
curated.update(str(Path(p).as_posix()) for p in glob.glob(pattern))
return curated
def _all_test_files() -> set[str]:
return {
str(Path(p).as_posix())
for p in glob.glob("tests/**/test_*.py", recursive=True)
}
def _baseline() -> list[str]:
lines = _BASELINE.read_text(encoding="utf-8").splitlines()
return [ln.strip() for ln in lines if ln.strip() and not ln.lstrip().startswith("#")]
def test_baseline_file_exists_and_is_sorted_and_unique() -> None:
entries = _baseline()
assert entries, "the baseline is empty — it should list the known full-only tests"
assert entries == sorted(entries), "baseline must stay sorted (stable diffs)"
assert len(entries) == len(set(entries)), "baseline contains duplicates"
def test_no_new_full_only_test_files() -> None:
"""A new test file must join a curated suite, or the gate it needs is absent.
If this fails on a file you just added: put it in the suite whose lane it
actually belongs to in ``core/cli_test.py::TEST_SUITES``. Adding it to the
baseline instead is available and is almost always the wrong answer the
baseline is for files that predate this pin, not an opt-out.
"""
orphans = _all_test_files() - _curated_files()
unlisted = sorted(orphans - set(_baseline()))
assert not unlisted, (
"these test files are in no curated suite and are not in the recorded "
"baseline, so they run on no pre-merge gate:\n "
+ "\n ".join(unlisted)
+ "\n\nRegister each in core/cli_test.py::TEST_SUITES."
)
def test_baseline_has_no_stale_entries() -> None:
"""The list may only shrink — a promoted or deleted file must leave it.
Enforced in BOTH directions, in the discipline ``test_volume_honesty.py``
uses: a baseline that silently keeps entries it no longer needs stops being
a measurement and becomes a story about one.
"""
curated = _curated_files()
present = _all_test_files()
entries = _baseline()
vanished = sorted(e for e in entries if e not in present)
assert not vanished, (
"baseline names files that no longer exist — delete these lines:\n "
+ "\n ".join(vanished)
)
promoted = sorted(e for e in entries if e in curated)
assert not promoted, (
"these files are now in a curated suite (good) but are still listed as "
"full-only — delete their baseline lines so the count reflects reality:\n "
+ "\n ".join(promoted)
)
def test_recorded_debt_matches_the_measurement() -> None:
"""Pin the number so a bulk change to it shows up as a reviewed decision.
749 at 2026-07-28. Lowering this is the point; raising it must be argued
for, not slipped in. The assertion names the direction so a reviewer of a
failing run knows immediately which one happened.
"""
entries = _baseline()
assert len(entries) <= 749, (
f"full-only test debt grew to {len(entries)} (was 749). The ratchet only "
"turns one way — register the new files in a curated suite instead."
)
def test_the_gate_guarding_pin_runs_on_the_gate() -> None:
"""The parity pin must itself be in ``smoke`` (N-9).
``test_cli_smoke_suite_covers_ci_smoke_gate`` enforces that the local suite
is never narrower than ``smoke.yml``. It lived in ``fast``, while the
pre-push gate runs ``smoke`` + ``deductive`` so the pin guarding the gate
did not run on the gate. This keeps it there.
"""
curated_src = (_ROOT / "core" / "cli_test.py").read_text(encoding="utf-8")
match = re.search(r"TEST_SUITES\s*(?::[^=]+)?=\s*\{", curated_src)
assert match is not None
start = match.end() - 1
depth = 0
end = len(curated_src)
for i, ch in enumerate(curated_src[start:], start):
if ch == "{":
depth += 1
elif ch == "}":
depth -= 1
if depth == 0:
end = i + 1
break
suites = ast.literal_eval(curated_src[start:end])
assert "tests/test_cli_test_suites.py" in suites["smoke"], (
"the smoke/CI parity pin must run on the gate it protects"
)
def test_this_pin_is_itself_registered() -> None:
"""No exemption for the membership pin — #136's lesson applied to itself."""
orphans = _all_test_files() - _curated_files()
assert "tests/test_suite_membership.py" not in orphans