Commit graph

12 commits

Author SHA1 Message Date
Claude
50fa287d17
revert(tests): drop the local-to-CI smoke parity assertion — CI is not a gate
Reverts the bidirectional half of the smoke parity pin added earlier today,
and records why at the assertion site so it is not "completed" again.

I read the suite list's comment ("so the local-first pre-push gate equals the
CI gate") as promising equality, made the assertion symmetric, and reported
tests/test_pack_draft_serve_boundary.py as drift because it sits in the local
gate and not in .github/workflows/smoke.yml.

That was wrong, and AGENTS.md says so in a line I had already read: GitHub
Actions are billing-locked and produce dead signals, never chase them. The
Forgejo host (e2-micro) cannot run workflows either. CI here is run MANUALLY
in-worktree — usually faster anyway on UMA hardware with real RAM — which is
what scripts/ci/local-ci.sh now front-ends. smoke.yml is secondary
observability, not a gate.

So the local suite is the SOURCE and is free to be broader. Asserting the
reverse converts a file nobody executes into a maintenance obligation, and one
agents cannot discharge at that — pushing workflow changes needs an OAuth scope
the push credential lacks. The three "owed" lines were never owed.

The surviving direction (CI subset-of local) still protects something real: if
smoke.yml ever names a path the local gate lacks, the local gate is narrower
than a published claim about it.

Arc-close brief updated to match: the "three files owed to smoke.yml" open item
is replaced by a recorded non-finding, so the next reader does not re-derive it.
Its shipped-work table now lists what actually landed in its place — the local
CI runner, the lane-roster fix, and the proposal-sink test-isolation fix.

[Verification]: 21 passed across test_cli_test_suites, test_lane_sha_verifier,
test_adr_index; ruff clean on the changed test.
NON-CANONICAL: Python 3.12.11, not the pinned 3.12.13 (unavailable for
linux-x86_64). Hash-pinned tests reproduce committed values regardless.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FduW6Krm3PPQv3P5iwBYtx
2026-07-25 13:44:30 +00:00
Claude
71bf04fb44
feat(provenance,teaching): close the lateral gaps the assessment actually found
Squashes the arc's work into one commit; the workflow-file edit it originally
carried is excluded (see the end of this message).

## Lane 1 — Workbench recorded a proved answer as ungrounded

With deduction_serving_enabled ratified ON (ADR-0256), workbench/api.py's live
chat route builds a bare ChatRuntime(), so the deduction composer decides
Workbench turns and stamps grounding_source="deduction" — but
_coerce_grounding_source carried a hand-copied whitelist of the six pre-arc
labels and silently rewrote anything else to "none". The runtime comment
reasoned this was inert because "REPL turns do not flow through Workbench's
CognitivePipelineRecord path". True, and irrelevant: the traffic flows the
other way. Stale since 2026-07-24.

Scope is one field. workbench/api.py:818 prefers TurnEvent.epistemic_state,
which read epistemic_state_needed — honest. So the UNregistered path degraded
honestly while the hand-copied whitelist asserted a falsehood; a second copy of
a closed enum was worse than no copy. Hence registration AND derivation:
GROUNDING_SOURCES exposes the Literal's members, and the coercion reads it.
workbench-ui badges/tokens/snapshot follow; enumCoverage.test.ts forces atomicity.

## Lane 2 — the ratification ceremony

The discovery loop was instrumented but not closed. teaching/ratification.py
turns a reviewed decision into a chain record, a corpus commit, and a receipt.

Its design turns on one observation: _ratified_rows DROPS unadmissible rows
silently — correct when serving, a trap when ratifying, because the file grows,
the commit lands, and the band count does not move. So the ceremony refuses to
call an append a ratification until it has re-read the curriculum through the
real loader and seen the chain arrive; a non-admitted append is rolled back.
Validation is a pre-flight courtesy, admission is the proof.

Arena queue entry and ledger reseal are deliberately NOT performed (bridge rule
1); the receipt names them. Front door: `core proposal-queue ratify`, a sibling
of `review` rather than a flag on it.

## Lane 3 — structural closures

- ADR-0263 gains rule 5: absence policy is DECLARED in CAPABILITY_LEDGERS, not
  passed at the call site. An AST-matched test fails if a serving path passes
  missing_ok again.
- Deductive suite added WHOLE to the pre-push gate: 285 tests in 29s against
  smoke's 216 in 62s, so no coverage trade was needed.
- Smoke/CI parity assertion made bidirectional. It was one-directional, and had
  drifted.
- test_prior_surface_deduction_binding.py pins correction binding on the
  deduction path. The review's diagnosis did NOT reproduce — hash_surface moves
  in lockstep — so it pins what is there. Mutation-checked.
- Domain-keyed ADR index over 312 flat-numbered files, explicitly partial.
- Arc-close brief template, plus this arc's own brief filled in against it.

## Lanes 4 and 5 — two premises falsified by measurement, one of them mine

Math 4.2: baseline reproduced (correct=5 wrong=0 refused=495); all four named
cases traced to one seam with each gap isolated by one-variable probes. Then the
number that changes the recommendation: the gap blocking case 0000 affects 1
case in 500, the 'than' gap blocking 0001 affects 2. ADR-0251's prohibition on
per-case growth now rests on a count. No reader change made.

CGA: versor_condition is 0.22% of a turn, not the "~10x proof latency" I claimed
— that multiplied an isolated microbenchmark by a call count and compared it to
a single verdict's latency. The real cost is geometric_product at 33,986
calls/turn (~73%) via cga_inner in search paths. The obvious closed form is NOT
bit-exact (954/4000 in f32); backend.vault_recall's serial fold IS (3000/3000,
worst-rel 0) and is the correct target. cargo test could not run —
static.crates.io is denied by the sandbox network policy — so the Rust parity
question stays open and the typestate lane is carried forward, not shipped
uncompiled.

## Not landed: three lines owed to .github/workflows/smoke.yml

The CI smoke gate is narrower than the local one —
test_pack_draft_serve_boundary.py (ADR-0253 INV-33) has been local-only, unseen
because the parity pin checked one direction. The edit was authored and rejected
at push for lacking the `workflow` OAuth scope, so it is recorded as a named,
dated PENDING_IN_CI exception rather than dropped: the assertion still fires on
any new divergence, and a second guard fires once the three land.

[Verification]: pre-push gates all green — smoke 236 passed, warmed_session 10
passed, deductive 285 passed. Ratification 14, ADR index 5, CLI suites 10.
Grounding/epistemic sweep 741 passed 1 skipped. workbench-ui 598 passed across
73 files, tsc -b clean. capability index 11 passed, digest unchanged. Math
holdout correct=5 wrong=0 refused=495. Committed chain corpora byte-unchanged
after the tests that write to them.
Environment caveat: the repo pins requires-python ==3.12.13, which uv cannot
fetch for linux-x86_64, so `uv sync --locked` fails. All Python runs used a
scratch venv on 3.12.11 with declared deps — not the locked universe, not the
full ~12k suite. The pin was left untouched. Re-run on a 3.12.13 host before
treating this as merge evidence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FduW6Krm3PPQv3P5iwBYtx
2026-07-25 04:51:15 +00:00
Shay
a4d68682df chore(generalization): Tier S housekeeping — smoke promotion, capability-index entries, promotion sweep (S5)
- Promote tests/test_register_substantive_consumption.py into the smoke
  suite (local core/cli_test.py + mirrored .github/workflows/smoke.yml):
  the falsifiable register-axis (ADR-0069/0071/0077) contract was red on
  main outside every gate for the 2026-07-22..24 window, masked by an
  unrelated flake label. 36 tests, ~4.6s.
- Found in passing: test_core_test_deductive_suite_expands_to_entailment_lane
  was already red on clean main (an exact-tuple pin from when the
  `deductive` suite had one file; it has since grown to 12). Fixed to a
  contains-style assertion so it can't go stale the same way again.
- Two new capability-index adapters: deduction_serve_existential_result
  (Band v6-EX alone — the one band among six that changes the decision
  procedure itself) and curriculum_serve_result. Breadth 11 -> 13; baseline
  re-frozen (a deliberate re-freeze per its own docstring).
- Promotion sweep: confirmed via the existing wrong=0 lane gate (run
  repeatedly this session across 166/166 deduction-serve cases) that no
  split beyond the already-applied ds-mem-0020 has a stale declined-gold
  case a current band now decides differently.
2026-07-24 17:13:19 -07:00
Shay
9f85832baa fix: full-suite gates — suite SoT + multi-root depth pin
- Re-export core.cli._TEST_SUITES from cli_test.TEST_SUITES so argparse
  and tests cannot drift from the runtime packs/smoke/algebra pins
  (Stage dual-pack draft boundary was only on cli_test).
- Align relational ablation multi-root metadata test with Stage 3
  fail-closed policy: ≥2 unique roots do not emit [root:] notes.

[Verification]: Smoke suite passed locally (~133s, 180 passed);
postfix targeted 5/5; full pre-fix was 4 failed / 13281 passed
(2 env dirt/flake classified separately).
2026-07-20 14:58:21 -07:00
Shay
25772154ff fix(cli): smoke suite parity with the CI smoke gate (audio sensorium lane)
All checks were successful
lane-shas / verify pinned lane SHAs (pull_request) Successful in 17m7s
smoke / smoke (-m "not quarantine") (pull_request) Successful in 23m40s
The CLI 'smoke' suite omitted tests/test_audio_*.py (6 files) that the
.github/workflows/smoke.yml PR gate runs — so the new AGENTS.md local-first
pre-push gate ('core test --suite smoke') was silently narrower than CI
(108 vs 175 tests). Adds the audio lane explicitly and pins parity:
test_cli_smoke_suite_covers_ci_smoke_gate parses the workflow's tests/
paths (globs expanded) and fails if the CLI tuple ever lags the CI gate.

[Verification]: CI-identical smoke file set passed locally (134s, 175
passed); tests/test_cli_test_suites.py 10 passed incl. the new pin.
2026-07-15 13:14:06 -07:00
Shay
310aed9ff0
chore: Refactor CLI and Governance Anchors (#926)
* docs: consolidate governance anchors and clean up test registries

* refactor(cli): decompose cli into dedicated modules

* test: fix broken test baselines and formatting

* docs: add domain boundary READMEs for governance anchors

* test: update baseline for determination lane

* test: fix capability_pass expectation

* test: fix CORE_SHOWCASE_SKIP_BUDGET enforcement

* chore: cleanup CLI extraction and unreachable code
2026-07-03 12:34:56 -07:00
Shay
3389cc68c3 feat: add deductive proof evidence gates 2026-06-04 08:37:51 -07:00
Shay
eed293c31c test: update enumeration pins to current system state (no behavior change)
- recognizer_registry: ratified registry grew past round-1 (later ratification
  rounds); assert the Phase C three remain present (subset) rather than pinning
  exactly 3.
- brief_11b: 0021 joined the pre_frame_filler set as the verb-class auditor
  evolved; it refuses, rows[0]=pre_frame_filler, and post-skip still refuses
  (zero-lift verified). Canary 0050 untouched; wrong=0 unaffected (audit-only).
- cli_test_suites: assert the packs invocation against the live _TEST_SUITES
  definition instead of a hardcoded file list (suite grew).
2026-06-03 01:27:40 -07:00
Shay
96e37e1fce
fix(quarantine): drain all 60 quarantined tests — QUARANTINE=∅ (#267)
* fix(quarantine): clusters A+D+E — 7 tests removed from quarantine

Cluster A (4): ledger status assertions accept 'expert' after
mathematics_logic was promoted past audit-passed. One-token
set-membership extension per test.

Cluster D (2):
- test_cli_test_suites: packs suite now includes
  test_adr_0127_pack_ratification.py; update expected call tuple.
- test_comb_pass_hot_path: pin compound==1 (the regression boundary);
  drop single==1 assertion — runtime discourse planner makes its own
  classify_compound_intent call at a separate import site.

Cluster E (1): bench_footprint cold-start loads >1GiB RSS in first
~10 turns; 1MiB/turn ceiling is only valid in warm steady-state.
Remove the per-turn RSS ceiling from the smoke test; add warmup_turns
param to bench_footprint for use in dedicated profiling runs.

* fix(quarantine): remove clusters A+D+E from QUARANTINE registry (49→42)

* fix(quarantine): cluster B — surface/format drift (15 tests, 42→27)

- 8 parametrized kinship tests: case-insensitive containment
  (surface capitalises first word; lemma is lowercase).
- runtime definition/recall kinship: same case fix.
- correction test: 'Nope that is wrong' never classified as CORRECTION
  (regex requires 'no', 'that is wrong', 'actually', etc.); use
  'That is wrong' which does classify correctly with no pack lemma.
- narrative chain: anaphoric rendering produces 'it grounds identity',
  not 'family grounds identity'; weaken to substring.
- example chain: 'family supports memory' no longer surfaces for a
  memory query; assert teaching-grounded + 'memory' in surface.
- collapse anchor: pack-grounded suffix no longer inlines domain atoms;
  drop the collapse_anchor.love surface assertion.
- articulation: surface != walk_surface by runtime contract design;
  rename test, check both fields non-empty instead of equal.

* fix(quarantine): cluster C — drain all 27 tests, QUARANTINE now empty

Fixes span three subsystems:

math parser / OOD generator:
- Add OOD unit registry words (ingots, shards, crystals, …) to
  allowed_nouns so rename_unit variants parse cleanly
- Add scarf/scarves and other -ves→-f irregulars to _PLURAL_IRREGULARS
  so _canonical_unit("scarf") → "scarves" (not "scarfs")
- Add _IRREGULAR_SINGULAR dict to _singular() in ood_surface_generator
  so "scarves" → "scarf" for n=1 rendering; prevents "scarve" parse error

eval lane drift:
- cold_start_grounding public cases: update 4 expected_grounding_source
  values from "pack"/"oov" → "teaching" (cognition chains now cover
  truth/memory/recall for DEFINITION prompts)
- gsm8k_math runner: handle fast-path graph=None (capacity/earnings
  solvers return is_admitted=True with selected_graph=None)
- coverage probe report: regenerate committed JSON after parser fix
  raised admission_rate and changed per_case trace hashes
- test_gsm8k_math_runner: add decoded_unarticulated / _rate to
  expected metrics key set

test guards:
- test_composed_surface + test_compound_walkthrough_eval_lanes: skip
  holdout-split tests when CORE_HOLDOUT_KEY unset (not a regression)
- test_en_core_action_v1_pack: EXPECTED_TOTAL 26→27, issubset check,
  provenance in-check for pack that gained one inflected entry
- test_relations_chains_v1: EXPECTED_CHAIN_IDS 7→21 after seed expansion

conftest: QUARANTINE frozenset emptied — ratchet at zero.

* fix: re-sign math expert claims after GSM8K probe regeneration

GSM8K coverage report changed (decoded_unarticulated added in cluster C)
which invalidated claim_digest in reviewers.yaml and signed claims artifact.
Recomputed and re-signed with current evidence bundle. Also fix
test_symbol_binding_uses_slots to accept TypeError on Python 3.12
frozen+slots dataclasses.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci: re-trigger full-pytest

* ci: retrigger after 30m timeout

* ci: raise full-pytest timeout-minutes 30→45

* fix(ci): skip showcase runtime budget on slow CI runners (CORE_SHOWCASE_SKIP_BUDGET)

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 11:22:12 -07:00
Shay
40cabdec09
Speed up validation lanes and pack loading
- add core test --suite fast for lightweight iteration validation
- cache parsed pack entries and compiled/mounted language packs
- return defensive manifold/list copies so transient mutations cannot leak through caches
- add CLI fast-suite coverage and pack cache isolation tests
- preserve exact recall, backend dispatch, and runtime semantics
2026-05-15 08:26:11 -07:00
Shay
b4ecf67e35
Fix CLI test suite pytest flags
- allow pytest flags after core test --suite without requiring separator
- preserve strict unknown-argument rejection for non-test commands
- add regression coverage for core test --suite packs -q
2026-05-15 06:25:37 -07:00
Shay
3d0b632e3b
Add CLI curated test suites
- add core test --suite aliases for smoke, runtime, cognition, teaching, packs, algebra, and full lanes
- preserve direct pytest passthrough through core test -- ...
- add core test --list-suites
- add focused CLI tests for suite listing, suite expansion, and passthrough
2026-05-15 06:21:21 -07:00