W-011: recognition refusal_reason now materializes in CognitiveTurnResult.refusal_reason via RECOGNITION_REFUSED enum value. Precedence: recognition wins over generation (earlier-fail boundary). W-012: ChatRuntime.chat() catches InnerLoopExhaustion from generate() and returns a typed refusal ChatResponse with refusal_reason populated, instead of propagating as an unhandled exception. Adds RefusalReason.RECOGNITION_REFUSED to generate/exhaustion.py. Lane SHAs: 7/7 match (demos don't exercise refusal paths — no re-pin). Smoke + cognition suites green. Full suite not run to completion. |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| __main__.py | ||
| anaphora.py | ||
| articulation_telemetry.py | ||
| atom_equivalence.py | ||
| cross_pack_grounding.py | ||
| dispatch_trace.py | ||
| example_surface.py | ||
| narrative_surface.py | ||
| oov_surface.py | ||
| pack_grounding.py | ||
| pack_resolver.py | ||
| pack_surface_candidate.py | ||
| partial_surface.py | ||
| refusal.py | ||
| register_substantive.py | ||
| register_variation.py | ||
| runtime.py | ||
| teaching_grounding.py | ||
| telemetry.py | ||
| thread_context.py | ||
| verdicts.py | ||