Files
majordomo/progress.md
T
steve 0d0e8e069e test: deterministic failover matrix — cooldown re-admission, alias chains, policies
Phase 2: proves ADR-0006/0008 semantics end to end with the fake provider
and fake clock (cooldown expiry, backoff growth, inline-alias failover,
permanent-error policies, retry budgets, bench-mid-request, exhaustion
reporting, custom classifier, chain-of-one parity).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 12:37:32 +02:00

2.8 KiB
Raw Blame History

progress

2026-06-10 — Phase 2: health + failover chain, proven

Landed: the full deterministic failover test matrix over the fake provider + fake clock (no sleeps, no network): single-transient recovery via same-target retry; repeated transients bench + advance; cooldown expiry re-admits and success resets; backoff doubling across bench rounds; mixed chain with an inline-expanded alias element failing over through the expanded targets; permanent-policy default (fail-fast on auth) and AdvanceOnPermanent override; TransientRetries disabled/custom; retry loop stops early when the tracker benches mid-request; exhaustion error lists skipped-while-benched targets; custom classifier override; chain-of- one gets identical semantics; HTTP 529 fails over. Implementation needed no changes — Phase 1's executor held up.

Next: Phase 3 — OpenAI/Anthropic/Ollama/foreman REST clients + media pipeline.

2026-06-10 — Phase 1: foundations, ADRs, skeleton, docs

Landed:

  • Module scaffold (Go 1.26), .gitea/workflows/ci.yaml (foreman-style gates: build, vet, race tests, tidy-diff), .env.example.
  • llm/ canonical contract: Message/Part (sealed; text+image), Request/Options, Response/Usage/FinishReason, Stream/StreamEvent, Tool/Toolbox (panic-safe Execute), Capabilities (zero-value semantics), Model/Provider interfaces, APIError + transient/permanent Classify.
  • health/: clock-injected tracker — consecutive-failure threshold, exponential capped cooldown, reset-on-success, thread-safe; full deterministic test suite (fake clock).
  • Root: Registry (providers/aliases/schemes/health), Parse with the binding grammar (verbatim model ids, inline recursive alias expansion, cycle detection, dedup), LLM_* env-DSN loading (go-llm-parity lazy fallback + eager LoadEnv/New scan), chain executor implementing Model (retry-on-transient, bench-on-repeat, skip-benched, 404-advance, fail-fast-on-auth, joined exhaustion errors). Built-ins register as resolvable stubs until their phases land.
  • provider/fake/: scriptable provider (per-model outcome queues, request recording, capabilities overrides, streaming) — the hermetic test rig.
  • ADRs 00010008 + index; CLAUDE.md; honest README with pending-marked matrix.
  • Tests cover the two required cases: the trailing-thinking chain parse and LLM_M1=foreman://token@host loading (plus DSN table, lazy fallback, cycle detection, chain failover/backoff/exhaustion, toolbox execution, error classification).

Notes: chain executor landed in Phase 1 (design was settled); Phase 2 deepens its test matrix (cooldown re-admission via fake clock, alias-in-chain failover, permanent-policy override) and wires anything the tests flush out.

Next: Phase 2 — exhaustive health/chain test matrix.