Classify empty completions as transient per human ruling (fixes flaky
real-gateway smoke and prevents caching empty responses), rename the
factory injection parameter gate to breaker per the frozen design,
rewrite the probe-entry cleanup without except BaseException, declare
python-dotenv explicitly, add a mid-backoff cancellation test, and
record all implementation errata in the design and architecture docs.
Correct the section 6.1 reason enum against actual CHS code, make
retry_after_s a non-optional float, add structured_data to LLMResponse
extensions, finalize the structured parameter type, document SSE
missing-done semantics and watchdog thinking-token liveness, add the
StructuredMW layer to the default onion order, and register
middleware/structured.py in the module map.
Per 2026-07-20 human decisions: multi-source switching/cooldown ships
with M1 (retry-loop signatures freeze there), both GovDoc and
Video-Tree must pass the M1 onboarding smoke test, and Redis
integration tests use the lab's remote Redis with isolated namespaces.
Define the five-step ladder (native-schema prevention, repair, shape
validation, bounded feedback re-ask, ResultInvalidError) as D14;
rewrite section 7.9 accordingly, give the structured parameter its
three-tier semantics in the chat() signature, and scope the bounded
re-ask outside transport retry and breaker counting.
Record tenacity vs self-built evaluation as D13 in ARCHITECTURE.md
(self-built wins: per-attempt orchestration, cancellation guarantees,
supply-chain discipline). Add research-wiki/ROADMAP.md expanding the
milestone table with ordering rationale and exit criteria.