You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(run): stop silent health-gate failures — the "sometimes it just fails" bug (v0.8.4)
A backend that flunked its `--version` health probe was dropped SILENTLY in
run.mjs's fallback loop (`if (!healthy) { fallbackCount++; continue; }`): no
lastErr, no failures.log, no status record — just a bare "backend options
exhausted; falling back to native" handoff with zero diagnostics. That made
transient probe misses look like random "the CLI refused to run" failures.
Compounded by two amplifiers in backends.mjs:
- health() cached NEGATIVE verdicts for the full 60s TTL, so a single
transient probe miss blackholed a working backend for a whole minute.
- the `--version` probe ran only ONCE, so one cold-start / AV-scan / ConPTY
hiccup scored the backend down.
Fix (3 surgical changes, routing contract untouched):
1. run.mjs: a health skip is now LOUD — sets lastErr (→ carried into the
handoff reason), writes a `failed` status record (kind:"health"), and
appends a structured record to failures.log.
2. backends.mjs health(): cache POSITIVE verdicts only; a negative verdict is
never cached → the very next call re-probes and recovers.
3. backends.mjs _healthUncached(): one-shot retry — probe `--version` up to
twice before declaring a backend down (happy-path cost ~0).
Tests: +2 regression cases (loud kind:"health" skip; one-shot-retry recovers a
single flaky --version) → 108/108. Verified by codex through the live relay
(VERDICT: PASS, no findings). Doc test-counts 106→108.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: .claude-plugin/marketplace.json
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -10,7 +10,7 @@
10
10
{
11
11
"name": "multi-model-team",
12
12
"description": "Delegates token-heavy, self-contained tasks to local CLI backends chosen by task size and type, with credit-exhaustion fallback through the backend chain to native Claude and a glanceable statusline HUD. Routing and shipped backend behavior are configured in config/roster.json; adding a new backend kind requires invoker and health support in code. /team runs a decompose → dispatch → verify → fix → synthesize pipeline; an optional config-gated UserPromptSubmit hook can proactively nudge delegation.",
"description": "Delegates token-heavy, self-contained tasks to local CLI backends chosen by task size and type, with credit-exhaustion fallback through the backend chain to native Claude and a glanceable statusline HUD. Routing and shipped backend behavior are configured in config/roster.json; adding a new backend kind requires invoker and health support in code. /team runs a decompose → dispatch → verify → fix → synthesize pipeline; an optional config-gated UserPromptSubmit hook can proactively nudge delegation.",
Copy file name to clipboardExpand all lines: package.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
{
2
2
"name": "multi-model-team",
3
-
"version": "0.8.3",
3
+
"version": "0.8.4",
4
4
"type": "module",
5
5
"private": true,
6
6
"description": "Delegates token-heavy, self-contained tasks to local CLI backends (agy/Gemini, codex) chosen by task size and type, with credit-exhaustion fallback to native Claude and a statusline HUD. Node ESM, zero-build, cross-platform (Windows/Linux/macOS).",
0 commit comments