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