- 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
- restore articulation surface as ChatResponse.surface while retaining walk_surface telemetry
- calibrate moderate E2 energy boundary
- reclose generated field states after propagation and recall
- restore pytest-safe REPL parsing and field_walk helper
- anchor proposition predicate selection to prompt field
- make vault exact self-recall deterministic
- align chat telemetry regression with restored surface contract
- calibrate identity threshold and per-axis telemetry
- keep walk surfaces visible when identity flags are telemetry
- report real vault recall hits through generation/runtime logs
- record selected surface in TurnEvent
- fix async chat persona reference
- add regression coverage for chat telemetry
- Fix IndentationError: `elaboration` field was indented inside the
docstring block instead of at the class body level (line 149).
- Add `value` and `alignment` aliases on IdentityScore so that
run_examples.py / review_trace.py can read `.value` and `.alignment`
(runtime.py and the serialiser both reference these names).
`value` mirrors `score`; `alignment` mirrors `1.0 - deviation fraction`.
- Add `axes_evaluated` property returning the deviation_axes frozenset
as a sorted list, matching the serialiser expectation in run_examples.py.
run_examples.py
Runs a curated set of example conversations through ChatRuntime,
writing one JSONL trace file per scenario to traces/. Each line in the
file is one TurnEvent serialised as JSON, giving the complete
determinism record for that turn. Scenarios cover:
- single-turn field probe
- multi-turn dialogue with memory (vault recall across turns)
- identity alignment pressure (input designed to approach the flag threshold)
- fatigue arc (many turns to observe ExertionMeter drain)
- versor drift (watches versor_condition across a session)
Run with: python scripts/run_examples.py
Output: traces/<scenario>.jsonl
review_trace.py
CLI reader for JSONL trace files produced by run_examples.py or
`core session`. Supports:
--summary one-line-per-turn table (turn, surface, role, score, cost, flagged)
--turn N full detail for a single turn
--flagged show only flagged turns
--drift print versor_condition per turn (tracks algebraic drift)
--identity print identity_score + alignment per turn
--fatigue print cycle_cost_total per turn (exertion arc)
Run with: python scripts/review_trace.py traces/<scenario>.jsonl [options]
cli: cmd_trace now includes identity_score, flagged, cycle_cost (from turn_log[-1])
cli: new cmd_session subcommand - multi-turn REPL that writes a trace file on exit
Six identity table rows → all green:
1. Non-identity PersonaMotor
PersonaMotor.from_identity_manifold() replaces PersonaMotor.identity().
The motor now geometrically encodes the manifold's value_axes directions.
2. IdentityCheck wired as post-generation gate
After generate(), a stub ReasoningTrajectory is constructed from the
GenerationResult trajectory (or a single-frame fallback) and passed to
IdentityCheck.check(). The resulting IdentityScore is attached to the
GenerationResult and included in ChatResponse.
3. CharacterProfile populated and projected
CharacterProfile.from_manifold() is called at __init__ time and stored
as self.character_profile. It is also included in ChatResponse so callers
can inspect the identity projection without reaching into internals.
4. drive_gradients influencing field walk
DriveGradientMap.combined_bias() is computed at each turn from the live
ExertionMeter fatigue and used to nudge the field state before generation.
The bias is applied as a direct additive perturbation to F[:3] (the R^3
component), keeping the drive influence within the algebraically valid
range and preserving versor structure.
5. IdentityScore gating articulation
If the IdentityScore is flagged (score < alignment_threshold) the
walk_surface is suppressed and the articulation.surface is used as the
sole response surface. The flag is propagated in ChatResponse.flagged.
6. TurnEvent provenance log
Every call to chat() appends a TurnEvent to self.turn_log. The log is
a plain list — append-only by convention. Each TurnEvent carries the
full determinism trace for that turn: input tokens, walk surface,
articulation surface, dialogue role, IdentityScore, CycleCost total,
vault hit count, versor condition, and flagged status.
agenerate() skipped _recall_state() entirely, meaning async streaming
responses were disconnected from session memory. This patch brings
agenerate() to full parity with the synchronous path:
- Accepts vault and recall_top_k parameters (default 3, matching generate())
- Calls _recall_state(_voiced_state(current, persona), vault, recall_top_k)
at each step before nearest-node selection
- Does not add stop_nodes or salience (those remain sync-only for now;
the core correctness gap is vault recall)
The async return value is still token-by-token via yield. Callers that
want final_state should use the synchronous path or wrap in a collector.
IdentityCheck runs after generation in ChatRuntime and must travel
forward with the result without requiring a second pass or a wrapper.
The field is Optional so all existing call sites that don't supply it
continue to work unmodified.
Builds a real, non-identity CGA motor from the value_axes directions
carried by an IdentityManifold. Each axis.direction is treated as a
3-vector in R^3, composed additively into a single translator, and
scaled by the axis's index to separate the directions in concept space.
This replaces the unconditional PersonaMotor.identity() call in
ChatRuntime with a motor that geometrically encodes CORE's character.
- CharacterProfile.from_manifold() populates traits/theological grounding
directly from a live IdentityManifold — no longer orphaned.
- TurnEvent is a frozen, append-only provenance record for one chat turn.
Carries: turn index, dialogue role, IdentityScore, CycleCost, vault hit
count, walk surface, and articulation surface. Enables full determinism
tracing across every turn without mutation.
- IdentityCheck.check() is unchanged in contract.
Key issues fixed:
- `CORE_BACKEND=numpy` was ignored, so tests mixed Python CGA embedding with Rust metric behavior.
- Dense construction seeds were being rejected by strict `unitize_versor()`, while sparse dirty inputs still needed to fail closed.
- Holonomy needed a construction-boundary path for raw/dense vocab fixtures and rare null final accumulators.
- Proposition storage polluted vault recall by storing the live field instead of the proposition’s subject versor.
- Dialogue qualitative frames rendered the same surface as assertive copular frames.
- Repeated session prompts could collapse into the same deterministic response path.
- Two proof fixtures were stale: one hand-built a non-null “null” vector, and one alignment proof omitted the English “with” anchor used by the resonance proof.
Verification:
`CORE_BACKEND=numpy CORE_STRICT_MLX_ON_APPLE=0 uv run core test -- -q`
Result: `277 passed in 59.52s`
Make versor construction fail closed instead of synthesizing hash-derived fallback rotors.
- remove pseudo-random construction fallback from unitize_versor
- add signed residual helper for +1 field states vs ±1 manifold entries
- validate vocab manifold entries with full residuals
- document antipodal transition rotor failure contract
- add focused invariant tests for versor closure and manifold validation
Add geometry-backed ArticulationPlan and realize(), wire articulation into ChatRuntime and trace output, expose proposition relation_norm, and add articulation/runtime/CLI tests.
Add RuntimeConfig with English default output policy, wire output language through runtime/frame selection/generation/CLI, preserve language metadata in mounted manifolds, and add runtime/CLI policy tests.
* Make core CLI help robust and intuitive
* Package runtime support modules for core CLI
* Add CLI help and doctor tests
* Fix CLI trace help and pack listing
* Export language pack listing helper
* Bootstrap repo root for console runtime imports
* Align trace formatter with Proposition schema
* Cover real trace payload formatting