- grammatical-coverage holdout v1: 52 cases across all 13 constructions, 100% pass
- zero-code-domain-acquisition lane: contract + 3 surprise domains (kinship,
calendar, color) with vocabulary, relations, axioms, teaching examples,
and dev prompts; pack closure verified for all three domains
- he_core_cognition_v1: 20 entries in Hebrew script with morphology decomposition
(triliteral roots, binyanim, aspect/person/gender/number); depth_root role
with fail_closed OOV policy
- grc_logos_cognition_v1: 20 entries in polytonic Greek with morphology
decomposition (stems, prefix/suffix chains, declension class, tense/voice/
mood/person); depth_relation role with fail_closed OOV policy
Establish the grammatical-coverage eval lane with 13 English v1
constructions (simple declarative, negation, conjunction, disjunction,
embedded clause, relative clause, quantification, tense, aspect).
- contract.md with scoring rubric and pass thresholds
- runner.py conforming to framework interface
- dev set: 41 cases (baseline: 24.4%, only C01/C10 pass)
- public v1: 36 cases (baseline: 19.4%, only C01/C10 pass)
- holdout and realizer engineering are next
The realizer currently handles only simple present-tense SVO declaratives.
Negation, conjunction, embedding, quantification, tense, and aspect all
need engineering work.
The top-level --version flag (bool) collided with eval's --version argument
(string). Rename the top-level dest to print_version so both coexist.
Also mark Phase 0 exit gate as complete in PROGRESS.md:
- v1 public: 13/13 (100% all metrics)
- holdout: 19/19 (unsealed plaintext, encryption deferred)
- baseline: scaffold with pluggable BaselineModel protocol
Remove shelved identity/drive tests that existed to justify premature
persona wiring, and update remaining tests to match the current runtime
contract: empty vault triggers unknown_domain gate on first turn, versor_apply
always closes to unit versor, and null-cone preservation is deferred to an
explicit geometry API.
562 passed, 4 skipped, 0 failed.
Keep the generic chat runtime neutral while base closure is being stabilized.
- replace PersonaMotor.from_identity_manifold(...) with PersonaMotor.identity() for the baseline ChatRuntime path
- leave identity/persona motivation for a later explicit IdentityProfile contract
- update the antipodal scalar transition test to match current closed-product semantics: B * reverse(A) yields closed transition -1
No GitHub CI/status checks were exposed for this PR.
Remove the implicit null-vector bypass from the runtime-facing versor_apply closure boundary.
FieldState.F is treated throughout the runtime and cognitive pipeline as a unit versor field. Returning null-like raw sandwich results from versor_apply created a contract mismatch and allowed multi-turn closure drift to escape into session state.
- make _close_applied_versor always close runtime field results
- keep unitize-first semantics and construction-seed fallback
- add regression proving null-like sandwich output is closed for the runtime contract
Null-vector preservation should return later behind an explicit geometry API, not the generic runtime field propagation path.
No GitHub CI/status checks were exposed for this PR.
Remove premature motivation/drive pressure from the generic chat runtime.
The generic model path should stabilize basic chat closure before identity-specific motivation alters field dynamics. The previous drive-bias hook directly mutated FieldState.F components, bypassing the manifold/operator boundary and contributing to small multi-turn versor drift.
This makes _apply_drive_bias() a documented no-op. Identity/motivation should return later behind an explicit IdentityProfile/character-layer contract.
No GitHub CI/status checks were exposed for this PR.
Implement the eval infrastructure defined in ADR-0016 before building new
eval lanes. This establishes the discipline that governs the entire
capability roadmap.
- Generic eval framework (evals/framework.py): lane discovery, versioned
scoring, result persistence
- Cognition lane retrofitted into new convention: 45 cases split into
stratified dev (13) / public v1 (13) / holdout (19) sets with contract,
runner, and recorded results
- Generalized `core eval <lane>` CLI: dynamic lane discovery, --list,
--version, --split, --save, --json flags
- Holdout runner scaffold: plaintext fallback, encryption interface ready
- Baseline runner scaffold: pluggable frontier model interface
- Fix: CognitiveTurnPipeline.run() crashed on turn_log[-1] when the
unknown-domain gate returned a stub without appending to turn_log
- ADR-0016, eval_methodology.md, PROGRESS.md, capability gates session log
Phase 0 exit audit found two methodology issues:
1. Pipeline turn_log crash (fixed here)
2. Versor drift in multi-turn sessions (pre-existing, under investigation)
_orient_result_to_anchor used np.dot (Euclidean dot product) alongside
cga_inner to decide hemisphere flips. When CGA inner was positive
(correct hemisphere) but Euclidean was negative, the flip negated CGA
alignment — making correctly-oriented fields rank last in vault recall.
Changes:
- Move hemisphere check into finalize_turn so all paths (ChatRuntime,
SessionContext.respond) get consistent protection.
- Use CGA inner product only, removing the forbidden Euclidean metric.
- Remove _orient_result_to_anchor (subsumed by finalize_turn).
- Remove SessionContext.arespond (dead code, no callers).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix running_dialogue_blade grade explosion: replace outer_product
accumulation (which pushed past grade-5 in Cl(4,1), silently zeroing
the blade from turn 3 onward) with CGA-inner-oriented blade tracking
that preserves grade-2 across arbitrary turn counts.
- Add versor_condition guard at session composition boundary: cross-turn
field composition via versor_apply now fails closed (threshold 1e-2,
matching algebra construction residue tolerance) instead of silently
propagating degraded fields into vault and generation.
- Replace VaultStore list with deque(maxlen=max_entries): eliminates
O(N) list.pop(0) on every bounded eviction; deque auto-evicts in O(1).
- Replace O(N) vocab scan in generate/stream.py stop_nodes construction
with O(1) try/except index lookup per stop token.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace synthetic word-transition rotor construction with the closed product B * reverse(A).
- preserve make_rotor_from_angle compatibility
- fail closed on non-closed transition candidates instead of using construction fallback behavior
- validate transition operator condition
- add targeted transition rotor regression tests
No GitHub CI/status checks were exposed for this PR.
Adds referent tracking, session graph traversal, unknown-domain gating, correction propagation, compositional surface assembly, and regression coverage.
Follow-up fixes included before merge:
- split probe/commit/finalize turn flow so unknown-domain checks run before current-query vault writes
- record real input tokens and input versors for sync and async session paths
- return true graph distances from backward walks and consume them in correction decay
- synchronize corrected graph outputs into vault-backed recall and live referent state
- regenerate correction responses from corrected context rather than correction text
- keep coreference pronouns lowercase in question bodies
- centralize elaboration-string construction to avoid plan/surface drift
- add targeted dialogue fluency regression tests
Implements the coupled forward-correction loop that separates CORE from
a nearest-neighbour lookup engine:
per iteration:
state, Δ_fwd = diffusion_op.forward(state) # spread context
state, Δ_corr = correction_op.adjoint_pass(state) # enforce intent
converged when both Δ_fwd < ε and Δ_corr < ε
field/operators.py:
- Add ConstraintCorrectionOperator(target_versor, correction_rate, node_index)
- adjoint_pass() builds an incremental correction rotor from the current
output-node versor toward the intent target using the exponential map
(same _unitize_f32 path, same boost/rotation blade classification).
This is a non-self-adjoint operator: it has a preferred direction.
- forward() is identity (correction acts only on the output node via adjoint_pass).
- The target is the prompt centroid versor — same geometry that seeds the
output node, so the correction restores coherence broken by diffusion.
scripts/run_pulse.py (V4):
- Build target_versor from prompt centroid before the loop (exposed from
_build_manifold as a second return value alongside state + labels).
- Instantiate GraphDiffusionOperator + ConstraintCorrectionOperator.
- Coupled convergence: loop until both Δ_fwd < ε AND Δ_corr < ε.
- Print both deltas each step for observability.
- --correction-rate flag (default 0.3) to tune correction strength.
- --no-correction flag to reproduce V3 pure-diffusion behaviour.
tests/test_pulse_integration.py:
- test_correction_pulls_toward_target: verifies output node moves closer
to target versor under correction than without it.
- test_coupled_loop_converges: full V4 pulse with correction converges.
- test_correction_rate_zero_is_identity: rate=0 leaves the field unchanged.
- test_different_inputs_produce_different_correction_targets: correction
targets differ for semantically distinct inputs.
Replace the divergent rotation-based diffusion operator with a linear
blend + exponential-map re-unitization approach that converges in ~28
steps while maintaining vc < 1e-6.
Key changes:
- GraphDiffusionOperator now averages neighbors in multivector space and
re-projects via per-plane exponentials (cos/sin for rotations, cosh/sinh
for boosts in Cl(4,1))
- run_pulse V3: per-token graph topology with input-driven output node,
recall via VocabManifold.nearest(), --no-glove flag for compiled pack
- Tests updated for V3 API
Different inputs now produce different recall rankings from the compiled
en_core_cognition_v1 vocabulary, completing Threshold 1 (Semantic Encoding).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements the English Supervised Seeding Epoch (V1):
- language_packs/en_seeder.py: downloads GloVe-6B-50d, projects each
token embedding through a CGA lift into Cl(4,1) via construction_seed_versor,
validates the versor invariant, and registers the word in VocabManifold.
- scripts/run_pulse.py: replaces the mock 10-word hash vault with the
live VocabManifold. Injection now uses TextProjectionHead.project()
against the seeded vocab; vault_recall queries VocabManifold.nearest().
Hash fallback retained for words absent from GloVe (OOV tagged fallback).
The CGA lift preserves semantic neighbourhood: words close in GloVe
cosine space map to versors that are geometrically proximate in Cl(4,1)
inner product space, so nearest() returns semantically coherent results
rather than hash-proximity artefacts."
Add ManifoldState (N,32) versor field over graph edges, GraphDiffusionOperator
with damped convergence via construction_seed_versor closure, deterministic
hash-to-versor stub, and run_pulse.py end-to-end script proving injection →
propagation → vault recall → token output. 24 new tests, zero regressions
on architectural invariants.
- cache morphology index per vocab identity for OOV grounding
- cache decomposition results per vocab/token with bounded storage
- preserve OOV semantics, audit records, final closure checks, and transient isolation
- add focused tests for determinism, audit preservation, transient isolation, closure, and cache reuse
- 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
- 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
- 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
Introduces teaching/ module with three-stage correction pipeline:
1. correction.py — extracts CorrectionCandidate from correction intents,
binding correction text to the prior turn it references
2. review.py — validates candidates: rejects identity overrides (17
marker patterns) and empty corrections; produces ReviewedTeachingExample
with deterministic SHA-256 review hash
3. store.py — bounded FIFO store for accepted examples; emits
PackMutationProposal objects instead of mutating the vocab manifold
directly; retrievable by subject
Design invariants:
- Identity override attempts are rejected at the review gate
- Pack mutations are proposal-only (applied=False by default)
- All traces are deterministic: same input → same candidate_id and review_hash
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
_farther_unrelated searched for grade-1 reflectors whose cga_inner
score was below the prompt score. Field states are even-grade
(grade 0+2+4), so cga_inner with a grade-1 reflector is always zero
— making the search impossible when prompt_score is negative.
Replaced with _random_rotor (product of two reflectors) which lives
in the same even-grade subspace and produces nonzero inner products.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- remove normalization and unitization calls from generation path
- skip invalid recalled fields instead of repairing them in generation
- punctuate selected articulation surfaces
- stabilize assertive dialogue roles
- anchor proposition slots to live field
- preserve session anchor orientation for coherence