zelari-code 2.11.1 → 2.12.0

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.
@@ -1,5 +1,7 @@
1
1
  import { VerifierService, } from '@zelari/core/verification';
2
2
  import { collectProviderText } from '../tools/krakenSelectTool.js';
3
+ import { resolveCrossModelVerifier } from '../tools/krakenModel.js';
4
+ import { getWorkingDiff } from '../gitOps.js';
3
5
  import { loadVerifierModelSelection } from './verifierResolution.js';
4
6
  /**
5
7
  * Opt-in rule (see module doc): explicit env wins in both directions;
@@ -37,11 +39,76 @@ export function makeVerifierCallModel(loadStream, identity, timeoutMs = 120_000)
37
39
  return { text, provider: identity.provider, model: identity.model };
38
40
  };
39
41
  }
40
- function resolveIdentity(selection, session) {
42
+ function resolveIdentity(selection, session, familyCandidates, env = process.env) {
41
43
  if (selection.mode === 'fixed') {
42
44
  return { provider: selection.provider, model: selection.model };
43
45
  }
44
- return session && session.provider && session.model ? session : null;
46
+ if (!session || !session.provider || !session.model)
47
+ return null;
48
+ // P0.6 cross-model: inherit mode may route to a different provider family
49
+ // when family candidates were supplied; otherwise keep session identity.
50
+ if (familyCandidates && familyCandidates.length > 0) {
51
+ const cross = resolveCrossModelVerifier(session, familyCandidates, env);
52
+ if (cross)
53
+ return { provider: cross.provider, model: cross.model };
54
+ }
55
+ return session;
56
+ }
57
+ /** Criterion ids that look like deterministic test/typecheck/build/lint runs. */
58
+ function isTestEvidenceCriterion(criterionId) {
59
+ const id = criterionId.toLowerCase();
60
+ return ['test', 'typecheck', 'build', 'lint'].some((k) => id.includes(k));
61
+ }
62
+ /**
63
+ * Blind evidence excerpt: criterionId + status + detail for deterministic
64
+ * test/typecheck/build/lint criteria, capped at maxChars. Empty when none.
65
+ */
66
+ export function extractTestOutputExcerpt(results, maxChars = 4000) {
67
+ const lines = [];
68
+ for (const r of results) {
69
+ if (!isTestEvidenceCriterion(r.criterionId))
70
+ continue;
71
+ lines.push([r.criterionId, r.status, r.detail].filter(Boolean).join(' — '));
72
+ }
73
+ if (lines.length === 0)
74
+ return '';
75
+ return lines.join('\n').slice(0, maxChars);
76
+ }
77
+ /**
78
+ * Build the BLIND review input for VerifierService.reviewCompletion:
79
+ * original task, synthetic deterministic-evidence summary, staged git diff
80
+ * summary, and a capped test-output excerpt. Never reads session messages,
81
+ * builder reasoning, or assistant text — the verifier sees evidence only.
82
+ * Every extra input degrades independently (empty/failing diff → omitted).
83
+ */
84
+ export async function buildBlindReviewInput(evaluation, deps) {
85
+ const results = evaluation.results ?? [];
86
+ const passed = results.filter((r) => r.status === 'pass').length;
87
+ const verdict = evaluation.evaluation?.verdict ?? 'UNKNOWN';
88
+ const summary = `Kraken BUILD turn — deterministic evidence: ${passed}/${results.length} ` +
89
+ `criteria pass, completion verdict ${verdict}.`;
90
+ const task = deps.task?.trim();
91
+ const testOutputExcerpt = extractTestOutputExcerpt(results);
92
+ let diffSummary;
93
+ try {
94
+ const res = await (deps.getDiff ?? getWorkingDiff)({
95
+ cwd: deps.cwd ?? process.cwd(),
96
+ maxChars: 8000,
97
+ staged: true,
98
+ });
99
+ if (res && !res.empty && res.diff)
100
+ diffSummary = res.diff;
101
+ }
102
+ catch {
103
+ // degrade-and-continue: the blind review proceeds without the diff
104
+ }
105
+ return {
106
+ ...(task ? { task } : {}),
107
+ summary,
108
+ ...(diffSummary !== undefined ? { diffSummary } : {}),
109
+ ...(testOutputExcerpt ? { testOutputExcerpt } : {}),
110
+ results,
111
+ };
45
112
  }
46
113
  /**
47
114
  * Run the advisory completion review and ATTACH it to the evaluation
@@ -56,7 +123,7 @@ export async function runAdvisoryVerifierReview(evaluation, deps = {}) {
56
123
  const selection = deps.selection ?? loadVerifierModelSelection();
57
124
  if (!verifierReviewEnabled(selection, env))
58
125
  return null;
59
- const identity = resolveIdentity(selection, deps.session);
126
+ const identity = resolveIdentity(selection, deps.session, deps.familyCandidates, env);
60
127
  let callModel = deps.callModel;
61
128
  if (!callModel) {
62
129
  if (!identity || !deps.loadStream)
@@ -74,12 +141,9 @@ export async function runAdvisoryVerifierReview(evaluation, deps = {}) {
74
141
  emit: deps.emit,
75
142
  env,
76
143
  });
77
- const passed = evaluation.results.filter((r) => r.status === 'pass').length;
78
- const summary = `Kraken BUILD turn — deterministic evidence: ${passed}/${evaluation.results.length} ` +
79
- `criteria pass, completion verdict ${evaluation.evaluation.verdict}.`;
144
+ const blind = await buildBlindReviewInput(evaluation, deps);
80
145
  const review = await service.reviewCompletion({
81
- summary,
82
- results: evaluation.results,
146
+ ...blind,
83
147
  session: deps.session,
84
148
  });
85
149
  evaluation.review = review;
@@ -1 +1 @@
1
- {"version":3,"file":"verifierLifecycle.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifierLifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verifierLifecycle.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifierLifecycle.ts"],"names":[],"mappings":"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"}