Two things, both surfaced by finally being able to run the tree.
## A pre-existing silent red
tests/test_lane_sha_verifier.py::TestExpectedLaneCoverage was RED on clean
main — confirmed by running it in a pristine worktree at origin/main, and the
file is untouched by any of this branch's work. deduction_serve_v1 (ADR-0256)
and curriculum_serve_v1 (ADR-0262) shipped during the generalization arc and
neither was added to EXPECTED_LANES.
The roster's `extra` assertion is a deliberate tripwire: a new lane is supposed
to fail it once so an author acknowledges the addition. Nobody did, and nothing
caught it, because that file is in neither `smoke` nor `deductive` — no local
gate and no CI job runs it. Same silent-red family as the exact-tuple pin S5
found in passing, and as the register-axis e2e tests that sat red for two days.
This commit is the acknowledgement the tripwire was asking for.
That it took running the full tree to find is the argument for the rest of this
commit.
## scripts/ci/local-ci.sh
AGENTS.md says the merge bar IS the local run. There was no single entry point
for it, and on any host without Python 3.12.13 exactly there was no local run
at all: pyproject pins requires-python == "3.12.13", so uv sync --locked fails
outright and every gate becomes unrunnable.
sh scripts/ci/local-ci.sh --tier smoke|gate|full
`gate` is the three pre-push steps; `full` is the whole tree in parallel. Suite
membership is read from core/cli_test.py::TEST_SUITES through the CLI and never
restated, so this runner cannot drift from the hook the way smoke.yml drifted
from the local list.
Interpreter contract, deliberately fail-closed: the pinned interpreter is
CANONICAL, and the runner refuses on anything else with instructions.
--allow-interpreter-fallback opts into any 3.12.x and stamps every run
NON-CANONICAL. Same discipline as ratified_ledger's missing_ok and the MLX
skip path: a degraded mode is legitimate, a degraded mode reporting itself as
the real thing is not.
Evidence recorded in the script header so the flag is not cargo-culted: the
committed-SHA / trace_hash / content_sha256 / lane-SHA pin set (119 tests) was
run on 3.12.11 and 118 passed, the one failure being the stale roster above,
which fails on 3.12.13 too. That is evidence the exact pin is not load-bearing
for bit-exactness — it is NOT a ruling that it should be relaxed. Relaxing it
is a reproducibility decision and belongs to a human.
## Observed, not fixed
Something in the suite writes a real proposal artifact into
teaching/proposals/derived_close_facts/ instead of a tmp_path. The three test
files that name that sink all override it correctly, so the leak is elsewhere —
likely an idle_tick/contemplation path exercising DEFAULT_SINK. Untracked
residue, removed here, flagged for follow-up. Notable because it is only
visible now that the parents[3] bug is fixed and the sink resolves inside the
repo.
[Verification]: gate tier via the new runner — smoke 236, warmed_session 10,
deductive 285, all passed, correctly stamped NON-CANONICAL. Fail-closed path
verified (exit 3 with instructions). lane_sha_verifier 6 passed. Full tests/
tree in progress at 63% with 0 failures at time of commit.
NON-CANONICAL: Python 3.12.11, not the pinned 3.12.13. Not merge evidence.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FduW6Krm3PPQv3P5iwBYtx
Weekly-audit 2026-07-22 closeout — T13 decision (3) CI gate + T11 execution.
- scripts/hooks/pre-push + install.sh: a core.hooksPath pre-push gate that runs
the smoke suite PLUS the warmed_session consistency lane pin — the T13
telemetry-consistency regression class that smoke does NOT cover. The full
~12k fast-lane stays async CI by design; the gate is deliberately targeted so
it blocks the regression class without gridlocking pushes. Fail-closed on
empty stdin; skips deletion-only pushes; emergency bypass git push --no-verify.
- scripts/ops/reset_candidate_corpus_t11_20260722.py: provenance record of the
T11 live-store reset. The 465 discovery candidates predated the #100
isolation fix and carried no per-record test/prod discriminator, so a surgical
quarantine was impossible; ruling was to clear (not asterisk). Executed as an
ADR-0219 atomic generation reset (empty candidate ledger, keep=1) — candidates
465 -> 0, turn_count 14990 and identity lineage preserved, tainted generations
GC'd. Data lives in gitignored engine_state/; this script is the audit trail.
- AGENTS.md: document the automated pre-push gate under the Local-First CI
Validation Protocol.
- weekly-audit ledger: T10 merged (#100), T11 ruled+executed, T13 (2) hedge-arm
ruling + (3) pre-push gate recorded.
[Verification]: smoke 180 passed (132.9s) + warmed_session lane 10 passed
(140.5s), exit 0 — worktree core-wt-infra @ base 9a428d84.
Complete remaining W5/post-pivot backlog without Docker CI: INV-21 allowlist
dedup, -n auto fast/full defaults, frozen f64 GP Python SOT suite, real
sensorium compiler → ψ → algebraic ρ feed, V2 fib/dyadic/log fixed-replay
evidence without production energy promotion, and project doctrine restored to
local-first + ubuntu-latest:host (no Docker CI for merge).
[Verification]: Smoke suite passed locally (145s, 176 passed); make test-fast
(-n auto) passed twice (11709 passed, 108 skipped each ~11–12 min).
Lands Shay's own correction (authored 2026-07-16 as commit 798c6d1c in
the primary checkout, never pushed): tea frequently hangs/times out
(Cloudflare 524) via HTTP/2 proxying and WAF handoffs — use the Forgejo
MCP tools instead. Also fixes two references the Local-First CI
Validation Protocol section had left stale: the smoke suite is 175
tests, not 108+ (parity-pinned by test_cli_smoke_suite_covers_ci_smoke_gate),
and PR creation goes through the Forgejo MCP tools, not `tea pr create`.
Ports the runner-migration doctrine (authored by the Gemini session against
a stale checkout; grafted here onto current main so the #40-era Local-First
protocol section is preserved, not clobbered):
- CI jobs dispatch to a local Act runner on the primary developer's Mac
(label ubuntu-latest:host = native macOS host execution; the ubuntu name
is a fiction — no Linux-only steps).
- The GCP e2-micro server-side runner was REMOVED 2026-07-16; never
re-provision it (1GB RAM, OOM class). A waiting queue while the Mac is
asleep is intentional — pre-push local gates are the real discipline.
- Workflows remain canonical and install the locked universe (uv sync
--locked, committed uv.lock). GitHub mirror Actions are billing-locked
dead signals.
- CLAUDE.md gains a one-line pointer (policy stays in AGENTS.md).
[Verification]: smoke suite passed locally (175 passed); docs-only.
Extracts the reasoning protocol demonstrated in the contemplation
refactor session into a canonical, reusable guide in AGENTS.md.
- New section: Reasoning and Problem-Solving Discipline (7 steps)
- Covers: read-first, shape-finding, leverage ranking, precise
enumeration, claims-grounded proof, cognitive model connection,
and commit discipline
- Documents the failure modes each step prevents
- CLAUDE.md + GEMINI.md: add pointer to the new protocol section
* fix: final cleanups for CGA substrate migration PR
- Update UI test fixtures to packs/data paths
- Clean CLAUDE.md/GEMINI.md to minimal per AGENTS.md
- Refactor fraction geometric construction into dedicated helper in problem_frame_contracts.py
- No TODOs left in code; notes in PR description
This completes the mechanical readiness for the CGA substrate + registry consolidation work.
* docs: include PR description for review
* chore: enforce forgejo tooling in AGENTS.md
* docs: update bootstrap skill and add git-forgejo config doc per new rules
* docs: remove deprecated git-forgejo wrapper docs
* chore: ignore local .mcp.json configuration file
* fix(ui): remove unsupported assessment.bindings usage to fix TS2339/TS7006 in constructionEvidencePanelModel
This change removes duplicate provider-specific rules across CLAUDE/GPT55/GROK files and replaces them with thin, provider-neutral shims that point back to the canonical AGENTS.md for all architectural invariants, PR discipline, and trust boundaries.
- update AGENTS.md with standing efficiency/performance and security doctrine
- align CLAUDE.md with current performance/security expectations
- update Copilot/Codex instructions with hot-path, trust-boundary, and CLI validation defaults
- refresh work sequencing now that eval and calibration are on main
Three items from the post-assessment stabilization slice:
1. field/state.py: restore frozen=True, slots=True
slots=True closes __dict__ on FieldState instances, preventing
incidental attribute injection that frozen=True alone does not block.
The holonomy field works cleanly with slots because ndarray | None
is a valid slotted field type in Python 3.12.
2. README.md: correct vocab/ layer description
Was: 'Word-to-versor manifold, edge rotors'
Now: 'Surface-token manifold points; indexed access for algebraic
transition construction'
Edge rotors are constructed by algebra/, not stored in vocab/.
This exact confusion caused vocab.edge_rotor() drift in earlier work.
3. AGENTS.md: add language-pack checksum rule
Manifest checksums MUST be computed by reading back the bytes
written to disk (Path(f).read_bytes()), never from in-memory strings
before serialization. Unicode-escaped JSON on disk != Python str.