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 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.
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
- 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
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.
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.