Files
6krrt/plans/pinch-relevance-and-failover-review.md
adlee-was-taken 3523dcf93e docs(plans): give every plan a Status line so the queue is greppable
plans/ held 58 documents and exactly one said whether it was open. The rest
mixed finished work, reviews of shipped work, parked specs and genuinely
pending ones, with nothing distinguishing them, so "how many plans are in
the queue" had no answer short of reading all 58.

Now `grep -H '^Status:' plans/*.md` is the answer:

    50 done   3 in progress   2 planned   2 reference   1 parked

Statuses were derived rather than guessed: CLAUDE.md's own built list and
"What's NOT built yet" section, plus checking the subject exists in the
code. A review of work that shipped counts as done -- it records what was
found, it is not a request for anything. `reference` separates the two docs
that are conventions rather than work items (admin-design-standards,
admin-work-framework), which otherwise read as permanently-open plans.

The vocabulary is deliberately five words. A larger one invites "mostly
done" and "blocked-ish", which is how the directory became unreadable.

test_plans_declare_status.py keeps it from rotting: a new plan without a
marker fails, as does an unknown status, one buried below the eighth line,
or an open status with no reason -- "planned" alone is the state that rots,
since nobody can tell later whether it waits on a decision, a dependency,
or just nobody's turn.

Also updates the sweep plan with what landed and what did not, including
that #9 was not a defect.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRQXz5SYZYVWscxS1QqF6U
2026-09-08 18:55:16 -04:00

7.8 KiB

Review: embedding-based pinch relevance + upstream failover/circuit breaker (commit 03f62e2)

Status: done -- review of shipped work

What it was reviewing: opencode/Atlas's implementation of both plans/pinch-embedding-relevance.md and plans/upstream-failover-and-circuit-breaker.md in one commit, per the plans/.omo/plans/pinch-embedding-relevance.md work plan approved earlier. Verified against the actual diff (git show 03f62e2) rather than the commit message, and ran the full suite directly: 673 passed (up from 562).

Verdict: correct and faithful except one integration gap the delivered tests don't catch

Pinch embedding relevance — correct

  • order_by_relevance (context_prune.py): ascending cosine similarity, correct empty/single-candidate handling.
  • trim_candidates: extracted cleanly from the old inline logic; both branches (no-user-turn path, num_protected_turns <= 0 path) reproduced exactly, confirmed by diffing line-for-line against the pre-existing prune_context body.
  • prune_context(relevance_order=...): the None branch is a byte-for-byte reproduction of the original uniform-compression code — confirmed by direct diff, not just the docstring's claim. The relevance-ordered branch is structurally bounded to never compress more candidates than the uniform pass: it walks a single permutation of the same candidate list and stops early, so its absolute worst case degrades to exactly today's behavior, never worse. A minor imprecision exists in the savings estimate used to decide when to stop (compares len(text) where the final compression step uses len(prose)), but it cannot violate the "never compress more than today" invariant and isn't worth a fix on its own.
  • _embed_for_relevance (dispatcher.py): fails closed to None on every path checked — RequestException, non-200, unparseable JSON, missing or malformed embedding vectors — each logging relevance_unavailable and never raising. Matches the spec's core safety requirement exactly.
  • _relevance_order_for: gates on cfg.pinch.enabled and cfg.pinch.relevance.enabled and min_candidates, uses _text_only (not extract_text) for candidate text and _last_user_text for the query — both match the decisions adopted at approval time.
  • config.yaml/config.py: PinchRelevanceConfig ships enabled: false, matching spec verbatim.

Upstream failover — correct, including the hard architectural part

  • Non-streaming loop (dispatcher.py, the while True: retry loop): on a >=400 response, retries the next alternatives candidate instead of raising immediately, and does not touch attempts_used — confirmed by reading the actual diff hunk, not inferring it from a comment. The quality retry budget and the availability failover are correctly kept separate.
  • Streaming path: this was the part of the spec hardest to get right, and it's genuinely done, not superficially matching the words. The old requests.post(...) call that used to live inside proxy() was removed entirely; a new pre-flight loop opens and status-checks each candidate via _open_upstream before StreamingResponse is ever constructed, closing discarded failed connections (attempt.close()), and proxy() now takes the already-open healthy connection as a parameter instead of opening its own. A dead replica genuinely never reaches the client as a 200 with a broken body.
  • routing.py's exclude_models filter: a clean 4-line addition matching the existing exclude_stale/exclude_deprecated shape exactly, default frozenset() so it's a no-op when unpopulated, no new import into routing.py (the exclusion set is computed in dispatcher._open_circuits and passed in, exactly as specified).
  • circuit_breaker.py itself is correct and matches session_cache.py's pure/injected-time pattern precisely: is_down, record_failure (exponential backoff, capped at max_cooldown_seconds), record_success, clear are all implemented as specified and unit-tested in isolation (tests/test_circuit_breaker.py).
  • config.yaml ships circuit_breaker.enabled: false with the exact cooldown values from the spec (30 / 600 / 2.0). The failover retry itself is correctly unconditional — only the circuit-breaker bookkeeping (record_failure) is gated behind cfg.circuit_breaker.enabled — matching the spec's explicit recommendation to ship failover default-on since its worst case matches today's behavior exactly.

record_success is never called — the one real gap

File: dispatcher.py. circuit_breaker.record_success is defined correctly (circuit_breaker.py:57) and unit-tested in isolation, but a repo-wide grep for record_success turns up exactly two hits: its own definition and its own isolated unit test. It is called from nowhere in the actual dispatch path — not the non-streaming loop, not the streaming pre-flight loop, only mentioned in a docstring comment (dispatcher.py:1843, "...becomes the probe that can clear the entry via record_success") that describes behavior the code next to it doesn't implement.

Consequence. record_failure's cooldown math is min(prev.cooldown_seconds * backoff_multiplier, max_cooldown) — it only ever looks at whatever is currently stored, with no signal that a success happened in between. Without record_success clearing the entry, any model with a failure history has its cooldown monotonically ratchet toward max_cooldown_seconds on every subsequent failure, even failures separated by long stretches of trouble-free service. That is the opposite of "passive recovery rebuilds trust," which was the explicit point of the design (plans/upstream-failover-and-circuit-breaker.md: "a success clears the entry entirely... the next failure after a success restarts at initial_cooldown_seconds, not wherever the backoff had climbed to").

Why it passed a green suite. T12's own acceptance criteria (.omo/plans/pinch-embedding-relevance.md) explicitly required asserting .record_success was called "with the survivor" — that assertion was never written. There is no integration test anywhere at the chat_completions level for the actual failover path; only the isolated helpers (_open_circuits, _embed_for_relevance, _open_upstream) and circuit_breaker.py's own unit tests are covered (tests/test_dispatcher_helpers.py, tests/test_circuit_breaker.py). The gap is invisible to the delivered tests because nothing exercises the real wiring end to end.

Severity. Dormant today — circuit_breaker.enabled: false by default, so nothing is affected until it's turned on. Once enabled, the "skip a dead model for a while" behavior still works correctly (is_down's time comparison doesn't need record_success to function), but the backoff-resets-after-recovery half of the design does not, which would show up as a real model gradually becoming permanently circuit-shy over the service's lifetime rather than what was actually specified.

Fix. Call circuit_breaker.record_success(current_model, provider) after a successful (< 400) response in the non-streaming loop, and after the streaming pre-flight loop confirms a healthy connection — both gated by cfg.circuit_breaker.enabled, matching how record_failure is already gated. Then add the integration test T12 already called for: a 503 on the first candidate, 200 on the second, asserting record_failure fired for the first and record_success for the second.

Recommendation

Land everything else as-is — it's a faithful, carefully verified implementation of both specs, including the one part (streaming failover) that was genuinely tricky to get right. Fix record_success before flipping circuit_breaker.enabled: true in any real deployment; it's a two-line addition plus the one integration test that would have caught its absence.