@lcv-ideas-software/cross-review 4.3.0 → 4.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,24 @@ standard `v00.00.00`; npm package versions remain SemVer.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [v04.03.01] — 2026-06-05
11
+
12
+ **Patch — provider skip classification hotfix.** This release follows up on a
13
+ real hard-gate incident where Claude/Anthropic was skipped after provider
14
+ overload. The immediate provider cause was Anthropic `overloaded_error`; the
15
+ runtime issue was that any `provider_error`, including non-retryable provider
16
+ 400-style failures, could be treated as skippable.
17
+
18
+ ### Changed
19
+
20
+ - `provider_error` is now skippable only when classified as retryable, so
21
+ non-retryable provider payload/schema rejections block convergence instead of
22
+ being silently removed from the panel.
23
+ - Anthropic `overloaded_error` without preserved HTTP status text is now treated
24
+ as retryable, matching HTTP 529 overload behavior.
25
+ - `session.peer_skipped_unavailable` events now include retryability, recovery
26
+ hint, and a redacted provider error preview in event data.
27
+
10
28
  ## [v04.03.00] — 2026-06-05
11
29
 
12
30
  **Minor — P1/P2/P3 audit follow-up.** This release closes the first concrete
package/README.md CHANGED
@@ -24,7 +24,7 @@ npm install -g @lcv-ideas-software/cross-review
24
24
  npm install -g @lcv-ideas-software/cross-review --registry=https://npm.pkg.github.com
25
25
  ```
26
26
 
27
- **Status.** Stable. Current release: **v04.03.00** (npm package `4.3.0`). See [CHANGELOG.md](./CHANGELOG.md) for the full release history.
27
+ **Status.** Stable. Current release: **v04.03.01** (npm package `4.3.1`). See [CHANGELOG.md](./CHANGELOG.md) for the full release history.
28
28
 
29
29
  > **Project renamed 2026-05-15.** This project was previously published as
30
30
  > [`@lcv-ideas-software/cross-review-v2`](https://www.npmjs.com/package/@lcv-ideas-software/cross-review-v2)
@@ -38,6 +38,7 @@ The version history at a glance:
38
38
 
39
39
  | Release | Scope |
40
40
  | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
41
+ | **`v04.03.01`** | Patch — tighten skip-peer classification so non-retryable provider errors block, while Anthropic overload events remain retryable and better surfaced in skip diagnostics. |
41
42
  | **`v04.03.00`** | Minor — P1/P2/P3 follow-up with unresolved-evidence close-out visibility, an offline fixture eval harness, and a read-only peer reliability report. |
42
43
  | **`v04.02.05`** | Patch — harden session auditability with terminal events, cost split reporting, `not_resurfaced` visibility, and relator provenance checks for session IDs/GitHub URLs. |
43
44
  | **`v04.02.04`** | Patch — harden truthfulness preflight auditability, add a read-only preflight retest tool, and reduce false parser warnings for attached/log evidence. |
@@ -22,6 +22,7 @@ import { SWEEP_MIN_IDLE_MS } from "../src/core/session-store.js";
22
22
  import { parsePeerStatus } from "../src/core/status.js";
23
23
  import { PEERS } from "../src/core/types.js";
24
24
  import { getCallerCandidatesFromClientInfo, lockCallerPeerSelection, pruneCompletedJobs, SessionIdSchema, setHostTokensRecord, verifyCallerIdentity, } from "../src/mcp/server.js";
25
+ import { classifyProviderError } from "../src/peers/errors.js";
25
26
  import { selectFromCandidates } from "../src/peers/model-selection.js";
26
27
  import { StubAdapter } from "../src/peers/stub.js";
27
28
  import { redact } from "../src/security/redact.js";
@@ -488,13 +489,13 @@ assert.equal(checkConvergence(["codex", "claude"], "READY", [fakeReady("codex"),
488
489
  // taxonomy + the skip-gated quorum floor + the zero-skip non-regression
489
490
  // invariant.
490
491
  {
491
- const fakeFailure = (peer, failureClass) => ({
492
+ const fakeFailure = (peer, failureClass, retryable = true) => ({
492
493
  peer,
493
494
  provider: "stub",
494
495
  model: "stub",
495
496
  failure_class: failureClass,
496
497
  message: `stub ${failureClass}`,
497
- retryable: true,
498
+ retryable,
498
499
  attempts: 3,
499
500
  latency_ms: 0,
500
501
  });
@@ -509,8 +510,12 @@ assert.equal(checkConvergence(["codex", "claude"], "READY", [fakeReady("codex"),
509
510
  "fallback_exhausted",
510
511
  ]) {
511
512
  assert.equal(isSkippableFailure(fakeFailure("grok", fc)), true, `v3.7.3 / skip-peer: ${fc} must be skippable (infra unavailability)`);
512
- assert.equal(SKIPPABLE_FAILURE_CLASSES.has(fc), true, `v3.7.3 / skip-peer: ${fc} must be in SKIPPABLE_FAILURE_CLASSES`);
513
513
  }
514
+ assert.equal(SKIPPABLE_FAILURE_CLASSES.has("provider_error"), true, "v3.7.3 / skip-peer: provider_error remains a known skip candidate when retryable");
515
+ assert.equal(isSkippableFailure(fakeFailure("grok", "provider_error", false)), false, "v4.3.1 / skip-peer: non-retryable provider_error (e.g. provider 400 payload/schema rejection) must block instead of being skipped");
516
+ const anthropicOverloaded = classifyProviderError("claude", "anthropic", "claude-opus-4-8", new Error('{"type":"error","error":{"details":null,"type":"overloaded_error","message":"Overloaded"},"request_id":"req_fixture"}'), 1, Date.now());
517
+ assert.equal(anthropicOverloaded.failure_class, "provider_error");
518
+ assert.equal(anthropicOverloaded.retryable, true, "v4.3.1 / provider-errors: Anthropic overloaded_error without HTTP status text must still be retryable");
514
519
  for (const fc of [
515
520
  "schema",
516
521
  "unparseable_after_recovery",