@lcv-ideas-software/cross-review 4.2.5 → 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 +48 -0
- package/README.md +10 -2
- package/dist/scripts/eval-fixtures.d.ts +54 -0
- package/dist/scripts/eval-fixtures.js +216 -0
- package/dist/scripts/eval-fixtures.js.map +1 -0
- package/dist/scripts/smoke.js +195 -3
- package/dist/scripts/smoke.js.map +1 -1
- package/dist/src/core/config.d.ts +1 -1
- package/dist/src/core/config.js +1 -1
- package/dist/src/core/convergence.js +5 -3
- package/dist/src/core/convergence.js.map +1 -1
- package/dist/src/core/orchestrator.js +31 -3
- package/dist/src/core/orchestrator.js.map +1 -1
- package/dist/src/core/reports.d.ts +2 -1
- package/dist/src/core/reports.js +30 -0
- package/dist/src/core/reports.js.map +1 -1
- package/dist/src/core/session-store.d.ts +2 -1
- package/dist/src/core/session-store.js +141 -0
- package/dist/src/core/session-store.js.map +1 -1
- package/dist/src/core/types.d.ts +30 -0
- package/dist/src/mcp/server.js +15 -0
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/peers/errors.js +5 -2
- package/dist/src/peers/errors.js.map +1 -1
- package/docs/apresentacao-cross-review.md +11 -8
- package/docs/apresentacao.md +24 -20
- package/docs/architecture.md +10 -0
- package/package.json +2 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AppConfig, PeerId } from "./types.js";
|
|
2
|
-
export declare const VERSION = "4.
|
|
2
|
+
export declare const VERSION = "4.3.1";
|
|
3
3
|
export declare const RELEASE_DATE = "2026-06-05";
|
|
4
4
|
export declare const DEFAULT_MAX_OUTPUT_TOKENS = 20000;
|
|
5
5
|
export declare function getLastFileConfigResult(): import("./file-config.js").ApplyFileConfigResult | undefined;
|
package/dist/src/core/config.js
CHANGED
|
@@ -17,7 +17,7 @@ function expandHome(rawPath) {
|
|
|
17
17
|
}
|
|
18
18
|
return rawPath;
|
|
19
19
|
}
|
|
20
|
-
export const VERSION = "4.
|
|
20
|
+
export const VERSION = "4.3.1";
|
|
21
21
|
export const RELEASE_DATE = "2026-06-05";
|
|
22
22
|
export const DEFAULT_MAX_OUTPUT_TOKENS = 20_000;
|
|
23
23
|
const COST_RATE_ENV_PREFIX = {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// EITHER of two paths, not just "the user declared no fallback model" —
|
|
9
9
|
// (a) the user declared NO fallback model for that peer, the pinned
|
|
10
10
|
// model hit an infrastructure failure, and retrying the SAME model
|
|
11
|
-
// was exhausted (`auth` / `rate_limit` / `provider_error` /
|
|
11
|
+
// was exhausted (`auth` / `rate_limit` / retryable `provider_error` /
|
|
12
12
|
// `network` / `timeout`); or
|
|
13
13
|
// (b) the user DID declare a fallback model, it was tried, and the
|
|
14
14
|
// declared fallback chain was itself drained (`fallback_exhausted`).
|
|
@@ -24,8 +24,8 @@ export const SKIP_QUORUM_FLOOR = 2;
|
|
|
24
24
|
// response at all, and the peer has no further model left to fall back
|
|
25
25
|
// to. v3.7.4 (Codex v3.7.3 parecer AUDIT-2): this state is reached two
|
|
26
26
|
// ways — (a) NO fallback model was declared and retrying the SAME pinned
|
|
27
|
-
// model was exhausted (`auth`, `rate_limit`, `provider_error`,
|
|
28
|
-
// `timeout`); or (b) a fallback model WAS declared, tried, and the
|
|
27
|
+
// model was exhausted (`auth`, `rate_limit`, retryable `provider_error`,
|
|
28
|
+
// `network`, `timeout`); or (b) a fallback model WAS declared, tried, and the
|
|
29
29
|
// declared chain was itself drained (`fallback_exhausted`). Either way
|
|
30
30
|
// these are SKIPPED (round continues on the remaining peers). Everything
|
|
31
31
|
// else stays in `rejected` and blocks convergence: a peer that DID respond
|
|
@@ -46,6 +46,8 @@ export const SKIPPABLE_FAILURE_CLASSES = new Set([
|
|
|
46
46
|
"fallback_exhausted",
|
|
47
47
|
]);
|
|
48
48
|
export function isSkippableFailure(failure) {
|
|
49
|
+
if (failure.failure_class === "provider_error")
|
|
50
|
+
return failure.retryable;
|
|
49
51
|
return SKIPPABLE_FAILURE_CLASSES.has(failure.failure_class);
|
|
50
52
|
}
|
|
51
53
|
export function checkConvergence(expectedPeers, callerStatus, peers, rejected,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convergence.js","sourceRoot":"","sources":["../../../src/core/convergence.ts"],"names":[],"mappings":"AAEA,2EAA2E;AAC3E,0EAA0E;AAC1E,+DAA+D;AAC/D,qEAAqE;AACrE,8BAA8B;AAC9B,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,sEAAsE;AACtE,yEAAyE;AACzE,
|
|
1
|
+
{"version":3,"file":"convergence.js","sourceRoot":"","sources":["../../../src/core/convergence.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { missingFinancialControlVars, RELEASE_DATE } from "./config.js";
|
|
|
7
7
|
import { checkConvergence, isSkippableFailure } from "./convergence.js";
|
|
8
8
|
import { estimateCacheSavings } from "./cost.js";
|
|
9
9
|
import { assertLeadPeerNotCaller, resolveLeadPeer } from "./relator-lottery.js";
|
|
10
|
-
import { sessionReportMarkdown } from "./reports.js";
|
|
10
|
+
import { sessionReportMarkdown, unresolvedEvidenceItems } from "./reports.js";
|
|
11
11
|
import { SessionStore } from "./session-store.js";
|
|
12
12
|
import { decisionQualityFromStatus } from "./status.js";
|
|
13
13
|
import { PEERS } from "./types.js";
|
|
@@ -2379,12 +2379,15 @@ export class CrossReviewOrchestrator {
|
|
|
2379
2379
|
session_id: session.session_id,
|
|
2380
2380
|
round: roundNumber,
|
|
2381
2381
|
peer: failure.peer,
|
|
2382
|
-
message: `Peer ${failure.peer} skipped this round
|
|
2382
|
+
message: `Peer ${failure.peer} skipped this round after ${failure.attempts} failed attempt(s) on model ${failure.model ?? "(pinned)"} (${failure.failure_class}); the round continues with the remaining peers.`,
|
|
2383
2383
|
data: {
|
|
2384
2384
|
peer: failure.peer,
|
|
2385
2385
|
failure_class: failure.failure_class,
|
|
2386
2386
|
model: failure.model,
|
|
2387
2387
|
attempts: failure.attempts,
|
|
2388
|
+
retryable: failure.retryable,
|
|
2389
|
+
recovery_hint: failure.recovery_hint,
|
|
2390
|
+
message: failure.message.slice(0, 1000),
|
|
2388
2391
|
},
|
|
2389
2392
|
});
|
|
2390
2393
|
}
|
|
@@ -2645,7 +2648,32 @@ export class CrossReviewOrchestrator {
|
|
|
2645
2648
|
let updated = this.store.read(session.session_id);
|
|
2646
2649
|
if (convergence.converged) {
|
|
2647
2650
|
this.store.saveFinal(session.session_id, input.draft);
|
|
2648
|
-
|
|
2651
|
+
const unresolvedEvidence = unresolvedEvidenceItems(updated);
|
|
2652
|
+
const baseReason = convergence.recovery_converged ? "recovered_unanimity" : "unanimous_ready";
|
|
2653
|
+
const outcomeReason = unresolvedEvidence.length > 0 ? `${baseReason}_with_unresolved_evidence` : baseReason;
|
|
2654
|
+
if (unresolvedEvidence.length > 0) {
|
|
2655
|
+
this.emit({
|
|
2656
|
+
type: "session.evidence_checklist_unresolved_on_finalize",
|
|
2657
|
+
session_id: session.session_id,
|
|
2658
|
+
round: round.round,
|
|
2659
|
+
message: `${unresolvedEvidence.length} unresolved evidence item(s) remain at convergence; finalizing with explicit unresolved-evidence reason.`,
|
|
2660
|
+
data: {
|
|
2661
|
+
outcome_reason: outcomeReason,
|
|
2662
|
+
unresolved_count: unresolvedEvidence.length,
|
|
2663
|
+
open_count: unresolvedEvidence.filter((item) => (item.status ?? "open") === "open")
|
|
2664
|
+
.length,
|
|
2665
|
+
not_resurfaced_count: unresolvedEvidence.filter((item) => item.status === "not_resurfaced").length,
|
|
2666
|
+
items: unresolvedEvidence.slice(0, 20).map((item) => ({
|
|
2667
|
+
id: item.id,
|
|
2668
|
+
peer: item.peer,
|
|
2669
|
+
status: item.status ?? "open",
|
|
2670
|
+
ask: item.ask,
|
|
2671
|
+
round_count: item.round_count,
|
|
2672
|
+
})),
|
|
2673
|
+
},
|
|
2674
|
+
});
|
|
2675
|
+
}
|
|
2676
|
+
updated = await this.store.finalize(session.session_id, "converged", outcomeReason);
|
|
2649
2677
|
}
|
|
2650
2678
|
this.store.saveReport(session.session_id, sessionReportMarkdown(this.store.read(session.session_id), this.store.readEvents(session.session_id)));
|
|
2651
2679
|
this.emit({
|