core/tests
Shay f47a85a3e7 feat(adr-0047): wire forward graph constraint into the chat hot path
Closes ADR-0046's deferred follow-up: convert the PropositionGraph
into an AdmissibilityRegion BEFORE generate() runs on the live
chat path.

== generate/intent_bridge.py ==

New public helper:

    build_graph_from_input(text, plan) -> PropositionGraph

Same internal call as _build_graph_from_intent, without the
post-generation ground_graph step — suitable for forward use.

== chat/runtime.py ==

When the new flag is on and output language is English, build the
graph and the region before generate() and pass it via region=.
Empty / fully OOV graphs return AdmissibilityRegion(allowed_indices=None),
which generate() treats as unconstrained — the change is a true
no-op when the graph carries no in-vocab anchors.

== core/config.py ==

RuntimeConfig.forward_graph_constraint: bool = False

Default False preserves all pre-ADR-0046 behaviour and the ADR-0024
honest-refusal contract.  A first attempt wired the constraint
unconditionally; 15 tests failed with InnerLoopExhaustion because the
intent-derived graph's CGA neighbourhood doesn't intersect the walk's
candidate pool with top_k=8 on the current packs.  The honest answer
is not to widen top_k until the failure goes away nor to silently
relax — both erase the architectural information that the geometry
of the graph and the geometry of the walk are not yet co-located.
Opt-in preserves ADR-0024 and follows the ADR-0022→0026 transition-
window pattern.

== Characterisation (core eval cognition, 13-case public split) ==

A/B with the flag toggled:

  Metric                  OFF      ON      Δ
  intent_accuracy        100.0%   100.0%   0
  surface_groundedness    15.4%    15.4%   0
  term_capture_rate        0.0%     0.0%   0
  versor_closure_rate    100.0%   100.0%   0
  InnerLoopExhaustion       0        0     0
  non-trivial constraint   n/a    6 / 13   —

Findings:
- Wiring is correct and safe (no exhaustions, closure unchanged).
- Single-token in-vocab subjects engage the constraint
  (light/knowledge/meaning/memory/correction).
- Multi-word OOV subject phrases produced by the intent classifier
  fall through to unconstrained — this is the existing intent-
  classifier contract surfacing into geometry, not a constraint bug.
- Restricting which tokens the walk may visit did not change
  surface_groundedness or term_capture_rate on this lane.  The
  surface-grounding gap therefore lives downstream of propagation
  — in the realizer / surface-assembly / dialogue-role path — and is
  the next load-bearing pull.  This isolates the next ADR's scope.

== tests/test_forward_graph_constraint_wiring.py (5 tests) ==

  - DEFAULT_CONFIG.forward_graph_constraint is False
  - Default runtime answers without InnerLoopExhaustion
  - Opt-in runtime answers on a short benign input
  - Graph builder + build_graph_constraint produce a labelled
    AdmissibilityRegion ("graph:unconstrained" or "graph:<root_id>")
  - Flag is observable on the frozen RuntimeConfig

== docs/decisions/ ==

  - ADR-0047 ratifies the wire-up, opt-in rationale, and A/B numbers.
  - README index updated; the Pillar 1→2→3 section now reflects both
    the primitive (ADR-0046) and the live wiring (ADR-0047), and
    names the next pull (realizer / surface assembly) explicitly.

Verification (this branch):

  tests/test_forward_graph_constraint_wiring.py    5 passed
  tests/test_graph_constraint.py                   8 passed
  core test --suite smoke                         67 passed
  core test --suite cognition                    121 passed
  core test --suite runtime                       19 passed
  core test --suite algebra                      132 passed
  core test --suite teaching                      17 passed
  core test --suite packs                          6 passed
  core eval cognition                            metrics unchanged from main

versor_condition(F) < 1e-6 invariant unaffected.
2026-05-18 06:18:10 -07:00
..
formation feat(formation/templates): four new course templates + shared helpers 2026-05-17 18:59:15 -07:00
__init__.py
test_achat.py test(chat): achat() and arespond() smoke tests — surface, fields, OOV grace, structural determinism 2026-05-14 14:31:49 -07:00
test_admissibility_trace.py feat(adr-0023): Forward Semantic Control proof evidence — Accepted 2026-05-17 12:55:19 -07:00
test_alignment_graph.py Fix test suite errors across core physics and generation 2026-05-14 13:02:32 -07:00
test_architectural_invariants.py feat(epistemic): Leak C read-side audit — INV-24 callsite registry, Leak C fully closed 2026-05-17 09:48:39 -07:00
test_articulation.py fix(tests): align suite with persona-neutral strict-closure contract 2026-05-16 05:37:12 -07:00
test_articulation_realizer_v2.py Add articulation realizer v2 2026-05-14 20:14:50 -07:00
test_audit_tour.py feat(adr-0042): audit-tour demo — pack-layer story in four scenes 2026-05-17 22:06:45 -07:00
test_benchmarks_profiler.py feat(benchmarks): discourse_paragraph lane + pipeline profiler + word-selection tracer 2026-05-16 21:53:46 -07:00
test_cga_inner_rust_parity.py feat(adr-0020): parity gates for cga_inner, geometric_product, versor_condition, versor_apply 2026-05-16 20:37:58 -07:00
test_chat_runtime.py Bridge chat OOV grounding 2026-05-13 20:47:28 -07:00
test_cli.py fix(tests): align suite with persona-neutral strict-closure contract 2026-05-16 05:37:12 -07:00
test_cli_demo.py docs(cli): self-explanatory demos — preambles + per-directory READMEs 2026-05-17 16:39:50 -07:00
test_cli_pack_validate_security.py Harden pack validator trust boundary 2026-05-15 11:50:15 -07:00
test_cli_test_suites.py Speed up validation lanes and pack loading 2026-05-15 08:26:11 -07:00
test_cognitive_eval_harness.py Add cognitive eval harness and calibration replay (#30) 2026-05-15 07:41:36 -07:00
test_cognitive_turn_pipeline.py Wire intent graph into cognitive pipeline 2026-05-14 20:05:00 -07:00
test_compiler.py
test_compose_relations.py feat(compositionality): compose_relations operator lifts lane 68.8% → 100% 2026-05-16 22:44:06 -07:00
test_core_ingest.py
test_core_semantic_seed_pack.py feat(packs): en_core_cognition_v1 v1.2.0 - rhetoric/metaphor/narrative 2026-05-16 15:15:14 -07:00
test_determinism_proofs.py Restore FieldState slots in determinism proof 2026-05-13 14:26:24 -07:00
test_deterministic_hash.py feat: manifold field topology, graph diffusion operator, vertical pulse 2026-05-15 16:02:48 -07:00
test_dialogue.py fix(tests): align suite with persona-neutral strict-closure contract 2026-05-16 05:37:12 -07:00
test_dialogue_fluency_regression.py fix: harden session field invariants and eliminate hot-path inefficiencies 2026-05-15 21:37:49 -07:00
test_energy.py Tighten hot-path backend consistency 2026-05-15 08:14:38 -07:00
test_engine_loop_proof.py Tighten session node tracking and generation selection 2026-05-13 14:35:31 -07:00
test_epistemic_invariants.py feat(adr-0021): epistemic_status surface wired across teaching + trace 2026-05-16 20:20:35 -07:00
test_ethics_check.py feat(adr-0034): EthicsCheck — structural surface parallel to SafetyCheck 2026-05-17 20:46:34 -07:00
test_ethics_packs.py feat(adr-0033): ethics packs — third pack-layer sibling to identity + safety 2026-05-17 20:41:04 -07:00
test_ethics_refusal_opt_in.py feat(adr-0037,adr-0038): per-predicate ethics refusal + hedge injection 2026-05-17 21:23:28 -07:00
test_explain.py feat(phase3): core/cognition/explain.py — close Gap 3 introspection 2026-05-16 15:09:48 -07:00
test_forward_graph_constraint_wiring.py feat(adr-0047): wire forward graph constraint into the chat hot path 2026-05-18 06:18:10 -07:00
test_forward_semantic_control.py feat(adr-0022): Forward Semantic Control — Accepted 2026-05-17 12:10:20 -07:00
test_generate_stream.py fix(tests): align suite with persona-neutral strict-closure contract 2026-05-16 05:37:12 -07:00
test_geometric_product_rust_parity.py feat(adr-0020): parity gates for cga_inner, geometric_product, versor_condition, versor_apply 2026-05-16 20:37:58 -07:00
test_graph_constraint.py fix(adr-0046): make forward-graph-constraint branch mergeable 2026-05-18 05:57:46 -07:00
test_graph_diffusion.py feat: manifold field topology, graph diffusion operator, vertical pulse 2026-05-15 16:02:48 -07:00
test_hedge_injection.py feat(adr-0039): audit completeness — TurnVerdicts bundle, stub TurnEvent, hedge_injected 2026-05-17 21:32:46 -07:00
test_holonomy.py
test_holonomy_resonance.py Implement trilingual field coherence 2026-05-13 19:53:37 -07:00
test_identity_gate.py fix(identity): close v3 paraphrase gap with two-layer override defense 2026-05-16 14:05:55 -07:00
test_identity_packs.py feat(cli): core chat --list-identity-packs + companion-file filter 2026-05-17 19:47:13 -07:00
test_identity_score_decomposition.py feat(surface): ADR-0031 — score-decomposition surface (per-axis hedges) 2026-05-17 20:16:22 -07:00
test_identity_surface_divergence.py feat(identity-packs): ADR-0028 — pack-driven hedge & claim-strength shaping 2026-05-17 19:42:54 -07:00
test_identity_surface_divergence_depth.py feat(surface): ADR-0030 — depth-language hedge wiring 2026-05-17 20:05:45 -07:00
test_inference_operators.py feat(phase3): multi_relation_walk closes Phase 3 v1 to 10/10 splits 2026-05-16 15:24:44 -07:00
test_inner_loop_admissibility.py feat(adr-0024): Phases 2-5 — corpus eval, v2 adversarial, threshold characterization, ADR-0025 design note 2026-05-17 14:07:50 -07:00
test_inner_loop_phase2.py feat(adr-0024): Phases 2-5 — corpus eval, v2 adversarial, threshold characterization, ADR-0025 design note 2026-05-17 14:07:50 -07:00
test_inner_loop_phase3.py feat(adr-0024): Phases 2-5 — corpus eval, v2 adversarial, threshold characterization, ADR-0025 design note 2026-05-17 14:07:50 -07:00
test_inner_loop_phase4.py feat(adr-0024): Phase 1 addendum — retire v1/dev fixture rot 2026-05-17 14:43:34 -07:00
test_intent_proposition_graph.py feat: add intent-proposition graph comprehension layer 2026-05-14 19:52:57 -07:00
test_intent_ratifier.py feat(adr-0022): Forward Semantic Control — Accepted 2026-05-17 12:10:20 -07:00
test_language_pack_cache.py feat(adr-0024): Phase 1 — wire inner-loop admissibility + determinism proof 2026-05-17 13:38:55 -07:00
test_language_pack_runtime.py Implement trilingual field coherence 2026-05-13 19:53:37 -07:00
test_long_context_comparison.py feat(adr-0044, adr-0045): domain ethics pack + long-context comparison 2026-05-17 22:31:47 -07:00
test_manifold.py
test_manifold_state.py feat: manifold field topology, graph diffusion operator, vertical pulse 2026-05-15 16:02:48 -07:00
test_margin_admissibility.py feat(adr-0026): Phase 3 — ranked admissibility with margin 2026-05-17 15:03:03 -07:00
test_medical_clinical_ethics_pack.py feat(adr-0044, adr-0045): domain ethics pack + long-context comparison 2026-05-17 22:31:47 -07:00
test_morphology_irregular.py fix(gaps): close G1+G2+G3 + identity vocab + pipeline safety-stub honour 2026-05-16 21:21:06 -07:00
test_morphology_registry.py Implement trilingual field coherence 2026-05-13 19:53:37 -07:00
test_motor.py Fix full test suite after cognitive runtime 2026-05-13 13:52:11 -07:00
test_null_cone.py
test_oov_grounding_cache.py Cache OOV morphology grounding structures 2026-05-15 11:53:46 -07:00
test_operator_calibration_replay.py Add cognitive eval harness and calibration replay (#30) 2026-05-15 07:41:36 -07:00
test_pack_measurements_phase2.py feat(adr-0043): Phase-2 pack measurements — claims → numbers 2026-05-17 22:19:24 -07:00
test_phase5_corpus.py feat(adr-0024): Phase 5 — stratified mechanism-isolation across 5 failure-mode families 2026-05-17 15:51:59 -07:00
test_phase6_demo.py feat(adr-0024): Phase 6 — comparative demo, three head-to-head conditions 2026-05-17 16:02:37 -07:00
test_pipeline.py
test_pipeline_teaching_integration.py feat: wire teaching loop into cognitive pipeline 2026-05-14 20:46:50 -07:00
test_probe_repl.py Implement trilingual field coherence 2026-05-13 19:53:37 -07:00
test_proof_properties.py feat: Full Proof — surface realizer join, Rust diffusion parity, benchmark harness 2026-05-15 17:39:14 -07:00
test_proposition.py Add proposition generation 2026-05-13 20:08:49 -07:00
test_provenance.py feat(evals): provenance lane v1 — replay determinism + source back-pointers 2026-05-16 11:45:00 -07:00
test_pulse_integration.py feat: Full Proof — surface realizer join, Rust diffusion parity, benchmark harness 2026-05-15 17:39:14 -07:00
test_realizer_quantifier_agreement.py fix(gaps): close G1+G2+G3 + identity vocab + pipeline safety-stub honour 2026-05-16 21:21:06 -07:00
test_refusal_contract.py feat(adr-0024): Phase 2 — honest refusal with typed evidence 2026-05-17 14:49:08 -07:00
test_replay_vs_llm_benchmark.py feat(compositionality): compose_relations operator lifts lane 68.8% → 100% 2026-05-16 22:44:06 -07:00
test_reviewed_teaching_loop.py feat: add reviewed teaching loop for controlled correction learning 2026-05-14 20:32:28 -07:00
test_rotor_admissibility.py feat(adr-0025): Phase 4 — rotor / frame admissibility at the seam 2026-05-17 15:16:32 -07:00
test_rotor_power.py fix(drift): proper rotor-manifold scaling; restore respond contract 2026-05-16 11:44:45 -07:00
test_runtime_config.py fix(tests): align suite with persona-neutral strict-closure contract 2026-05-16 05:37:12 -07:00
test_rust_backend.py feat(algebra): null-preserving versor_apply path + un-skip 2 invariant tests 2026-05-16 21:40:37 -07:00
test_safety_check.py feat(safety): ADR-0032 — SafetyCheck structural surface 2026-05-17 20:25:22 -07:00
test_safety_pack.py feat(safety): ADR-0029 — always-loaded, never-replaceable safety pack 2026-05-17 19:56:29 -07:00
test_safety_refusal.py feat(adr-0036): safety-only typed refusal policy 2026-05-17 21:10:52 -07:00
test_salience.py fix(tests): align suite with persona-neutral strict-closure contract 2026-05-16 05:37:12 -07:00
test_segmenter.py
test_semantic_realizer_integration.py feat(adr-0023): Forward Semantic Control proof evidence — Accepted 2026-05-17 12:55:19 -07:00
test_sensorium_mount.py
test_session_coherence.py fix(session): CGA-only hemisphere consistency, remove forbidden Euclidean metric 2026-05-15 21:51:16 -07:00
test_surface.py test(surface): full unit test suite for SentenceAssembler — roles, guard, elaboration, languages, determinism 2026-05-14 14:29:46 -07:00
test_telemetry_fanout_and_summary.py feat(adr-0041): core chat --show-verdicts + FanOutSink 2026-05-17 21:47:47 -07:00
test_telemetry_sink.py feat(adr-0040): structured-logging sink for turn-event audit 2026-05-17 21:39:58 -07:00
test_transition_rotor.py fix(algebra): enforce transition rotor invariants 2026-05-15 21:13:14 -07:00
test_turn_loop_verdicts.py feat(adr-0035): turn-loop auto-invocation — surfacing only 2026-05-17 20:57:33 -07:00
test_turn_verdicts_bundle.py feat(adr-0039): audit completeness — TurnVerdicts bundle, stub TurnEvent, hedge_injected 2026-05-17 21:32:46 -07:00
test_unknown_token_ingest.py Ground unknown tokens in ingest 2026-05-13 20:33:20 -07:00
test_vault_config.py fix(tests): align suite with persona-neutral strict-closure contract 2026-05-16 05:37:12 -07:00
test_vault_recall.py Activate and verify Rust backend 2026-05-13 22:23:48 -07:00
test_vault_recall_rust_parity.py feat(rust-parity): vault_recall first surface — bit-identity gate passes 2026-05-16 17:14:22 -07:00
test_vault_recall_vectorised.py feat(phase4): long-context-cost lane + ADR-0019 Stage 1 vault recall vectorisation 2026-05-16 16:39:30 -07:00
test_vault_store.py feat: vault recall index, Rust versor parity, cognitive pack expansion 2026-05-15 15:34:39 -07:00
test_versor_apply_rust_parity.py perf(rust): versor_apply f64 parity port — 29x over Python, bit-identical 2026-05-16 20:43:01 -07:00
test_versor_closure.py feat(algebra): null-preserving versor_apply path + un-skip 2 invariant tests 2026-05-16 21:40:37 -07:00
test_versor_condition_rust_parity.py feat(adr-0020): parity gates for cga_inner, geometric_product, versor_condition, versor_apply 2026-05-16 20:37:58 -07:00
test_vocab_manifold_invariants.py Fail closed on invalid versor construction 2026-05-14 10:55:11 -07:00