@mmnto/totem 1.64.0 → 1.64.2
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/dist/artifacts/panel.d.ts +1919 -0
- package/dist/artifacts/panel.d.ts.map +1 -0
- package/dist/artifacts/panel.js +503 -0
- package/dist/artifacts/panel.js.map +1 -0
- package/dist/artifacts/panel.test.d.ts +15 -0
- package/dist/artifacts/panel.test.d.ts.map +1 -0
- package/dist/artifacts/panel.test.js +335 -0
- package/dist/artifacts/panel.test.js.map +1 -0
- package/dist/artifacts/post-checks-rules.d.ts +93 -0
- package/dist/artifacts/post-checks-rules.d.ts.map +1 -0
- package/dist/artifacts/post-checks-rules.js +307 -0
- package/dist/artifacts/post-checks-rules.js.map +1 -0
- package/dist/artifacts/post-checks-rules.test.d.ts +9 -0
- package/dist/artifacts/post-checks-rules.test.d.ts.map +1 -0
- package/dist/artifacts/post-checks-rules.test.js +258 -0
- package/dist/artifacts/post-checks-rules.test.js.map +1 -0
- package/dist/artifacts/post-checks.d.ts +102 -0
- package/dist/artifacts/post-checks.d.ts.map +1 -0
- package/dist/artifacts/post-checks.js +80 -0
- package/dist/artifacts/post-checks.js.map +1 -0
- package/dist/artifacts/post-checks.test.d.ts +12 -0
- package/dist/artifacts/post-checks.test.d.ts.map +1 -0
- package/dist/artifacts/post-checks.test.js +103 -0
- package/dist/artifacts/post-checks.test.js.map +1 -0
- package/dist/compiler-schema.d.ts +329 -0
- package/dist/compiler-schema.d.ts.map +1 -1
- package/dist/compiler-schema.js +136 -1
- package/dist/compiler-schema.js.map +1 -1
- package/dist/compiler-schema.test.js +136 -1
- package/dist/compiler-schema.test.js.map +1 -1
- package/dist/compiler.d.ts +2 -2
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +1 -1
- package/dist/compiler.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Panel-synthesis engine tests (mmnto-ai/totem#2104, strategy#474 slice 5).
|
|
3
|
+
*
|
|
4
|
+
* The invariants the cohort + strategy pre-build rounds locked in:
|
|
5
|
+
* - Tenet 9: aggregation is a pure deterministic script (order-independent).
|
|
6
|
+
* - dedup anchor = `ruleName`; divergence = pass∧fail present, abstain neutral.
|
|
7
|
+
* - honest diversity (Prop 291): distinctProviders is a cluster count only while
|
|
8
|
+
* provider-string ≡ family; an unrecognized string trips `coarse` (PP1 tripwire).
|
|
9
|
+
* - sensor-only: no panel-level gate field (PP3).
|
|
10
|
+
* - codex folds: persist reports w/ ADR-109 invariant at write+read; within-lane
|
|
11
|
+
* duplicate ruleName throws; conflicting tier throws; canonical-order hash.
|
|
12
|
+
* - agy folds: missing ruleName across lanes ⇒ implicit abstain (Σ === N); N=1.
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from 'node:fs';
|
|
15
|
+
import * as os from 'node:os';
|
|
16
|
+
import * as path from 'node:path';
|
|
17
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
18
|
+
import { TotemParseError } from '../errors.js';
|
|
19
|
+
import { cleanTmpDir } from '../test-utils.js';
|
|
20
|
+
import { assemblePanelArtifact, classifyDiversity, computePanelArtifactContentHash, PANEL_ARTIFACT_SCHEMA_VERSION, PanelArtifactSchema, panelsDir, readPanelArtifact, synthesizePanel, writePanelArtifact, } from './panel.js';
|
|
21
|
+
import { RUN_ARTIFACT_SCHEMA_VERSION } from './schema.js';
|
|
22
|
+
// ─── Fixtures ──────────────────────────────────────────────────────────────
|
|
23
|
+
function runArtifact(provider, seed = provider) {
|
|
24
|
+
return {
|
|
25
|
+
schemaVersion: RUN_ARTIFACT_SCHEMA_VERSION,
|
|
26
|
+
inputBundle: { maskedPrompt: `prompt ${seed}` },
|
|
27
|
+
inputHash: 'a'.repeat(64),
|
|
28
|
+
grounding: { hash: 'b'.repeat(64), provenanceSummary: 'similarity-only' },
|
|
29
|
+
backend: {
|
|
30
|
+
provider,
|
|
31
|
+
model: `${provider}-model`,
|
|
32
|
+
qualifiedModel: `${provider}:${provider}-model`,
|
|
33
|
+
admissionClass: 'completion_only',
|
|
34
|
+
taskProfile: 'Review',
|
|
35
|
+
},
|
|
36
|
+
output: { content: `response ${seed}`, metrics: { durationMs: 1000 } },
|
|
37
|
+
createdAt: '2026-06-14T00:00:00.000Z',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function finding(ruleName, verdict, tier = 'decidable', message = `${ruleName}:${verdict}`) {
|
|
41
|
+
return { ruleName, tier, verdict, message };
|
|
42
|
+
}
|
|
43
|
+
function report(findings, isRejected) {
|
|
44
|
+
return {
|
|
45
|
+
findings,
|
|
46
|
+
isRejected: isRejected ?? findings.some((f) => f.tier === 'decidable' && f.verdict === 'fail'),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function lane(laneId, provider, findings = [], isRejected) {
|
|
50
|
+
return { laneId, artifact: runArtifact(provider, laneId), report: report(findings, isRejected) };
|
|
51
|
+
}
|
|
52
|
+
const AT = '2026-06-14T12:00:00.000Z';
|
|
53
|
+
// ─── classifyDiversity ───────────────────────────────────────────────────────
|
|
54
|
+
describe('classifyDiversity — honest labeling (Prop 291)', () => {
|
|
55
|
+
it('two same-family lanes are same-vendor-isolated, not cross-vendor', () => {
|
|
56
|
+
const d = classifyDiversity(['gemini', 'gemini']);
|
|
57
|
+
expect(d).toMatchObject({
|
|
58
|
+
distinctProviders: 1,
|
|
59
|
+
class: 'same-vendor-isolated',
|
|
60
|
+
diversityConfidence: 'verified',
|
|
61
|
+
unrecognizedProviders: [],
|
|
62
|
+
});
|
|
63
|
+
expect(d.providers).toEqual(['gemini', 'gemini']); // lossless
|
|
64
|
+
});
|
|
65
|
+
it('distinct families are cross-vendor + verified', () => {
|
|
66
|
+
expect(classifyDiversity(['gemini', 'anthropic'])).toMatchObject({
|
|
67
|
+
distinctProviders: 2,
|
|
68
|
+
class: 'cross-vendor',
|
|
69
|
+
diversityConfidence: 'verified',
|
|
70
|
+
unrecognizedProviders: [],
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
it('PP1 tripwire: an unrecognized provider string is coarse, never a confident cross-vendor', () => {
|
|
74
|
+
const d = classifyDiversity(['gemini', 'vertex']);
|
|
75
|
+
expect(d.distinctProviders).toBe(2);
|
|
76
|
+
expect(d.unrecognizedProviders).toEqual(['vertex']);
|
|
77
|
+
// The class reflects the raw count, but confidence MUST flag it untrustworthy
|
|
78
|
+
// so a consumer cannot read it as a confident independent-cluster claim.
|
|
79
|
+
expect(d.diversityConfidence).toBe('coarse');
|
|
80
|
+
});
|
|
81
|
+
it('N=1 baseline labels cleanly without throwing', () => {
|
|
82
|
+
expect(classifyDiversity(['anthropic'])).toMatchObject({
|
|
83
|
+
distinctProviders: 1,
|
|
84
|
+
class: 'same-vendor-isolated',
|
|
85
|
+
diversityConfidence: 'verified',
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
// ─── synthesizePanel ─────────────────────────────────────────────────────────
|
|
90
|
+
describe('synthesizePanel — deterministic aggregation (Tenet 9)', () => {
|
|
91
|
+
it('groups findings by ruleName across lanes (one entry per rule)', () => {
|
|
92
|
+
const s = synthesizePanel([
|
|
93
|
+
lane('l1', 'gemini', [finding('rA', 'pass')]),
|
|
94
|
+
lane('l2', 'gemini', [finding('rA', 'pass')]),
|
|
95
|
+
lane('l3', 'gemini', [finding('rA', 'pass')]),
|
|
96
|
+
]);
|
|
97
|
+
expect(s.findings).toHaveLength(1);
|
|
98
|
+
expect(s.findings[0]).toMatchObject({ ruleName: 'rA', tier: 'decidable' });
|
|
99
|
+
expect(s.findings[0].verdicts).toEqual({ pass: 3, fail: 0, abstain: 0 });
|
|
100
|
+
});
|
|
101
|
+
it('is order-independent under lane permutation', () => {
|
|
102
|
+
const lanes = [
|
|
103
|
+
lane('l1', 'gemini', [finding('rA', 'pass'), finding('rB', 'fail')]),
|
|
104
|
+
lane('l2', 'anthropic', [finding('rA', 'fail'), finding('rB', 'fail')]),
|
|
105
|
+
lane('l3', 'openai', [finding('rA', 'pass')]),
|
|
106
|
+
];
|
|
107
|
+
const forward = synthesizePanel(lanes);
|
|
108
|
+
const reversed = synthesizePanel([...lanes].reverse());
|
|
109
|
+
expect(reversed).toEqual(forward);
|
|
110
|
+
});
|
|
111
|
+
it('divergence: a rule with both pass and fail is divergent; abstain is neutral', () => {
|
|
112
|
+
const s = synthesizePanel([
|
|
113
|
+
lane('l1', 'gemini', [finding('rDiv', 'pass'), finding('rCalm', 'pass')]),
|
|
114
|
+
lane('l2', 'gemini', [finding('rDiv', 'fail'), finding('rCalm', 'abstain')]),
|
|
115
|
+
]);
|
|
116
|
+
const div = s.findings.find((f) => f.ruleName === 'rDiv');
|
|
117
|
+
const calm = s.findings.find((f) => f.ruleName === 'rCalm');
|
|
118
|
+
expect(div.divergent).toBe(true);
|
|
119
|
+
expect(calm.divergent).toBe(false); // pass + abstain is NOT divergence
|
|
120
|
+
expect(s.divergences).toBe(1);
|
|
121
|
+
});
|
|
122
|
+
it('missing ruleName across lanes counts as implicit abstain (Σ verdicts === lane count)', () => {
|
|
123
|
+
const s = synthesizePanel([
|
|
124
|
+
lane('l1', 'gemini', [finding('rOnly1', 'pass')]),
|
|
125
|
+
lane('l2', 'gemini', []), // rOnly1 absent here
|
|
126
|
+
]);
|
|
127
|
+
const f = s.findings.find((x) => x.ruleName === 'rOnly1');
|
|
128
|
+
expect(f.verdicts).toEqual({ pass: 1, fail: 0, abstain: 1 });
|
|
129
|
+
const sum = f.verdicts.pass + f.verdicts.fail + f.verdicts.abstain;
|
|
130
|
+
expect(sum).toBe(2);
|
|
131
|
+
});
|
|
132
|
+
it('preserves lane messages verbatim, sorted', () => {
|
|
133
|
+
const s = synthesizePanel([
|
|
134
|
+
lane('l1', 'gemini', [finding('rA', 'pass', 'decidable', 'zebra reason')]),
|
|
135
|
+
lane('l2', 'gemini', [finding('rA', 'pass', 'decidable', 'apple reason')]),
|
|
136
|
+
]);
|
|
137
|
+
expect(s.findings[0].messages).toEqual(['apple reason', 'zebra reason']);
|
|
138
|
+
});
|
|
139
|
+
it('verdictDistribution tallies each lane isRejected (accepted/rejected, sums to N)', () => {
|
|
140
|
+
const s = synthesizePanel([
|
|
141
|
+
lane('l1', 'gemini', [finding('rA', 'fail')]), // decidable fail ⇒ rejected
|
|
142
|
+
lane('l2', 'gemini', [finding('rA', 'pass')]), // accepted
|
|
143
|
+
lane('l3', 'gemini', [finding('rA', 'pass')]), // accepted
|
|
144
|
+
]);
|
|
145
|
+
expect(s.verdictDistribution).toEqual({ accepted: 2, rejected: 1 });
|
|
146
|
+
});
|
|
147
|
+
it('throws on a within-lane duplicate ruleName (codex #2)', () => {
|
|
148
|
+
expect(() => synthesizePanel([lane('l1', 'gemini', [finding('rDup', 'pass'), finding('rDup', 'fail')])])).toThrow(/duplicate finding for ruleName/);
|
|
149
|
+
});
|
|
150
|
+
it('throws on conflicting tier for one ruleName across lanes (codex #9)', () => {
|
|
151
|
+
expect(() => synthesizePanel([
|
|
152
|
+
lane('l1', 'gemini', [finding('rT', 'pass', 'decidable')]),
|
|
153
|
+
lane('l2', 'gemini', [finding('rT', 'pass', 'sensor')]),
|
|
154
|
+
])).toThrow(/conflicting tiers/);
|
|
155
|
+
});
|
|
156
|
+
it('throws on zero lanes', () => {
|
|
157
|
+
expect(() => synthesizePanel([])).toThrow(/at least one lane/);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
// ─── sensor-only: NO panel gate field (PP3) ──────────────────────────────────
|
|
161
|
+
describe('panel is a sensor, never a gate (PP3)', () => {
|
|
162
|
+
it('PanelSynthesis exposes only verdictDistribution/findings/divergences', () => {
|
|
163
|
+
const s = synthesizePanel([lane('l1', 'gemini', [finding('rA', 'fail')])]);
|
|
164
|
+
expect(Object.keys(s).sort()).toEqual(['divergences', 'findings', 'verdictDistribution']);
|
|
165
|
+
expect(s).not.toHaveProperty('isRejected');
|
|
166
|
+
expect(s).not.toHaveProperty('verdict');
|
|
167
|
+
expect(s).not.toHaveProperty('accepted');
|
|
168
|
+
});
|
|
169
|
+
it('PanelArtifact exposes no top-level gate boolean', () => {
|
|
170
|
+
const a = assemblePanelArtifact([lane('l1', 'gemini', [finding('rA', 'fail')])], AT);
|
|
171
|
+
expect(Object.keys(a).sort()).toEqual([
|
|
172
|
+
'createdAt',
|
|
173
|
+
'diversity',
|
|
174
|
+
'lanes',
|
|
175
|
+
'schemaVersion',
|
|
176
|
+
'synthesis',
|
|
177
|
+
]);
|
|
178
|
+
expect(a).not.toHaveProperty('isRejected');
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
// ─── assemble + schema version tolerance ─────────────────────────────────────
|
|
182
|
+
describe('assemblePanelArtifact + schema-version tolerance (F1)', () => {
|
|
183
|
+
it('assembles a canonical artifact (lanes sorted by laneId)', () => {
|
|
184
|
+
const a = assemblePanelArtifact([
|
|
185
|
+
lane('zzz', 'gemini', [finding('rA', 'pass')]),
|
|
186
|
+
lane('aaa', 'anthropic', [finding('rA', 'pass')]),
|
|
187
|
+
], AT);
|
|
188
|
+
expect(a.lanes.map((l) => l.laneId)).toEqual(['aaa', 'zzz']);
|
|
189
|
+
expect(a.diversity.class).toBe('cross-vendor');
|
|
190
|
+
expect(a.schemaVersion).toBe(PANEL_ARTIFACT_SCHEMA_VERSION);
|
|
191
|
+
});
|
|
192
|
+
it('rejects an input lane whose report.isRejected breaks the ADR-109 invariant', () => {
|
|
193
|
+
// isRejected:true but no decidable fail ⇒ corrupt; assemble validates on the way out.
|
|
194
|
+
const bad = lane('l1', 'gemini', [finding('rA', 'pass')], /* isRejected */ true);
|
|
195
|
+
expect(() => assemblePanelArtifact([bad], AT)).toThrow();
|
|
196
|
+
});
|
|
197
|
+
it('accepts any 1.x schemaVersion, rejects ≥2.x loud', () => {
|
|
198
|
+
const a = assemblePanelArtifact([lane('l1', 'gemini', [finding('rA', 'pass')])], AT);
|
|
199
|
+
expect(() => PanelArtifactSchema.parse({ ...a, schemaVersion: '1.5.0' })).not.toThrow();
|
|
200
|
+
expect(() => PanelArtifactSchema.parse({ ...a, schemaVersion: '2.0.0' })).toThrow();
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
// ─── cross-field invariants Zod-enforced, not just documented (greptile P2 / CR) ──
|
|
204
|
+
describe('cross-field invariants fail parse, not silently pass (greptile P2, CR F1/F2)', () => {
|
|
205
|
+
// rA: fail in l1, pass in l2 ⇒ divergent; 2 lanes ⇒ N=2, verdictDistribution {1,1}.
|
|
206
|
+
const valid = () => assemblePanelArtifact([
|
|
207
|
+
lane('l1', 'gemini', [finding('rA', 'fail')]),
|
|
208
|
+
lane('l2', 'anthropic', [finding('rA', 'pass')]),
|
|
209
|
+
], AT);
|
|
210
|
+
it('a verdictDistribution that does not sum to lane count fails parse', () => {
|
|
211
|
+
const c = structuredClone(valid());
|
|
212
|
+
c.synthesis.verdictDistribution.accepted = 99;
|
|
213
|
+
expect(() => PanelArtifactSchema.parse(c)).toThrow();
|
|
214
|
+
});
|
|
215
|
+
it('a finding whose verdicts do not sum to lane count fails parse', () => {
|
|
216
|
+
const c = structuredClone(valid());
|
|
217
|
+
c.synthesis.findings[0].verdicts.pass += 5;
|
|
218
|
+
expect(() => PanelArtifactSchema.parse(c)).toThrow();
|
|
219
|
+
});
|
|
220
|
+
it('a stale divergences count fails parse', () => {
|
|
221
|
+
const c = structuredClone(valid());
|
|
222
|
+
c.synthesis.divergences += 1;
|
|
223
|
+
expect(() => PanelArtifactSchema.parse(c)).toThrow();
|
|
224
|
+
});
|
|
225
|
+
it('a divergent flag inconsistent with its verdicts fails parse', () => {
|
|
226
|
+
const c = structuredClone(valid());
|
|
227
|
+
c.synthesis.findings[0].divergent = false; // rA is genuinely divergent
|
|
228
|
+
c.synthesis.divergences = 0; // keep the count consistent so only the flag check fires
|
|
229
|
+
expect(() => PanelArtifactSchema.parse(c)).toThrow();
|
|
230
|
+
});
|
|
231
|
+
it('a diversity.providers length mismatch with lane count fails parse', () => {
|
|
232
|
+
const c = structuredClone(valid());
|
|
233
|
+
c.diversity.providers = [...c.diversity.providers, 'extra'];
|
|
234
|
+
expect(() => PanelArtifactSchema.parse(c)).toThrow();
|
|
235
|
+
});
|
|
236
|
+
it('a providers array with wrong contents (right length + distinct count) fails parse', () => {
|
|
237
|
+
const c = structuredClone(valid());
|
|
238
|
+
// lanes are l1=gemini, l2=anthropic; swap providers so length (2) and distinct
|
|
239
|
+
// count (2) still match but the per-lane mapping is wrong (CodeRabbit round 2).
|
|
240
|
+
c.diversity.providers = ['anthropic', 'gemini'];
|
|
241
|
+
expect(() => PanelArtifactSchema.parse(c)).toThrow();
|
|
242
|
+
});
|
|
243
|
+
it('a diversityConfidence overclaiming "verified" over an unrecognized provider fails parse (greptile — PP1 read guard)', () => {
|
|
244
|
+
// A lane genuinely on an unrecognized provider assembles correctly as coarse.
|
|
245
|
+
const a = assemblePanelArtifact([
|
|
246
|
+
lane('l1', 'gemini', [finding('rA', 'pass')]),
|
|
247
|
+
lane('l2', 'vertex', [finding('rA', 'pass')]),
|
|
248
|
+
], AT);
|
|
249
|
+
expect(a.diversity.diversityConfidence).toBe('coarse'); // sanity: correct assembly
|
|
250
|
+
const c = structuredClone(a);
|
|
251
|
+
c.diversity.diversityConfidence = 'verified'; // overclaim — must not pass read
|
|
252
|
+
expect(() => PanelArtifactSchema.parse(c)).toThrow();
|
|
253
|
+
});
|
|
254
|
+
it('a class inconsistent with providers fails parse (greptile — re-derived label)', () => {
|
|
255
|
+
const a = assemblePanelArtifact([
|
|
256
|
+
lane('l1', 'gemini', [finding('rA', 'pass')]),
|
|
257
|
+
lane('l2', 'gemini', [finding('rA', 'pass')]),
|
|
258
|
+
], AT);
|
|
259
|
+
const c = structuredClone(a); // providers ['gemini','gemini'] ⇒ same-vendor-isolated
|
|
260
|
+
c.diversity.class = 'cross-vendor'; // overclaim
|
|
261
|
+
expect(() => PanelArtifactSchema.parse(c)).toThrow();
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
// ─── storage: content-address, dedup, round-trip, invariant-at-read ──────────
|
|
265
|
+
describe('panel storage (mirrors run storage)', () => {
|
|
266
|
+
let totemDir;
|
|
267
|
+
beforeEach(() => {
|
|
268
|
+
totemDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-panel-'));
|
|
269
|
+
});
|
|
270
|
+
afterEach(() => {
|
|
271
|
+
cleanTmpDir(totemDir);
|
|
272
|
+
});
|
|
273
|
+
it('writes at artifacts/panels/<hash>.json and reads it back', () => {
|
|
274
|
+
const a = assemblePanelArtifact([lane('l1', 'gemini', [finding('rA', 'pass')])], AT);
|
|
275
|
+
const saved = writePanelArtifact(totemDir, a);
|
|
276
|
+
expect(saved.existed).toBe(false);
|
|
277
|
+
expect(saved.path).toBe(path.join(totemDir, 'artifacts', 'panels', `${saved.hash}.json`));
|
|
278
|
+
expect(panelsDir(totemDir)).toBe(path.join(totemDir, 'artifacts', 'panels'));
|
|
279
|
+
expect(readPanelArtifact(totemDir, saved.hash)).toEqual(a);
|
|
280
|
+
});
|
|
281
|
+
it('content address excludes createdAt — identical panels dedup across time', () => {
|
|
282
|
+
const lanes = [lane('l1', 'gemini', [finding('rA', 'pass')])];
|
|
283
|
+
const early = assemblePanelArtifact(lanes, '2026-06-14T00:00:00.000Z');
|
|
284
|
+
const late = assemblePanelArtifact(lanes, '2026-06-15T09:30:00.000Z');
|
|
285
|
+
expect(computePanelArtifactContentHash(early)).toBe(computePanelArtifactContentHash(late));
|
|
286
|
+
const first = writePanelArtifact(totemDir, early);
|
|
287
|
+
const second = writePanelArtifact(totemDir, late);
|
|
288
|
+
expect(second.existed).toBe(true);
|
|
289
|
+
expect(second.hash).toBe(first.hash);
|
|
290
|
+
// first-write-wins: the stored createdAt is the early one.
|
|
291
|
+
expect(readPanelArtifact(totemDir, first.hash).createdAt).toBe('2026-06-14T00:00:00.000Z');
|
|
292
|
+
});
|
|
293
|
+
it('content address is stable under lane input permutation', () => {
|
|
294
|
+
const a = [
|
|
295
|
+
lane('a', 'gemini', [finding('rA', 'pass')]),
|
|
296
|
+
lane('b', 'anthropic', [finding('rA', 'fail')]),
|
|
297
|
+
];
|
|
298
|
+
const h1 = computePanelArtifactContentHash(assemblePanelArtifact(a, AT));
|
|
299
|
+
const h2 = computePanelArtifactContentHash(assemblePanelArtifact([...a].reverse(), AT));
|
|
300
|
+
expect(h1).toBe(h2);
|
|
301
|
+
});
|
|
302
|
+
it('throws TotemParseError on a ≥2.x panel on disk', () => {
|
|
303
|
+
const a = assemblePanelArtifact([lane('l1', 'gemini', [finding('rA', 'pass')])], AT);
|
|
304
|
+
const hash = 'c'.repeat(64);
|
|
305
|
+
fs.mkdirSync(panelsDir(totemDir), { recursive: true });
|
|
306
|
+
fs.writeFileSync(path.join(panelsDir(totemDir), `${hash}.json`), JSON.stringify({ ...a, schemaVersion: '2.0.0' }));
|
|
307
|
+
expect(() => readPanelArtifact(totemDir, hash)).toThrow(TotemParseError);
|
|
308
|
+
});
|
|
309
|
+
it('throws on a disk panel whose persisted report breaks the isRejected invariant', () => {
|
|
310
|
+
const a = assemblePanelArtifact([lane('l1', 'gemini', [finding('rA', 'pass')])], AT);
|
|
311
|
+
const corrupt = structuredClone(a);
|
|
312
|
+
corrupt.lanes[0].report.isRejected = true; // no decidable fail ⇒ invariant broken
|
|
313
|
+
const hash = 'd'.repeat(64);
|
|
314
|
+
fs.mkdirSync(panelsDir(totemDir), { recursive: true });
|
|
315
|
+
fs.writeFileSync(path.join(panelsDir(totemDir), `${hash}.json`), JSON.stringify(corrupt));
|
|
316
|
+
expect(() => readPanelArtifact(totemDir, hash)).toThrow(TotemParseError);
|
|
317
|
+
});
|
|
318
|
+
it('rejects a disk panel with an inconsistent tally (greptile P2 / CR — re-auditable contract)', () => {
|
|
319
|
+
const a = assemblePanelArtifact([lane('l1', 'gemini', [finding('rA', 'pass')])], AT);
|
|
320
|
+
const corrupt = structuredClone(a);
|
|
321
|
+
corrupt.synthesis.verdictDistribution.accepted = 99; // no longer sums to lane count
|
|
322
|
+
const badHash = 'e'.repeat(64);
|
|
323
|
+
fs.mkdirSync(panelsDir(totemDir), { recursive: true });
|
|
324
|
+
fs.writeFileSync(path.join(panelsDir(totemDir), `${badHash}.json`), JSON.stringify(corrupt));
|
|
325
|
+
expect(() => readPanelArtifact(totemDir, badHash)).toThrow(TotemParseError);
|
|
326
|
+
});
|
|
327
|
+
it('rejects an invalid id (not a sha256 hex)', () => {
|
|
328
|
+
expect(() => readPanelArtifact(totemDir, 'not-a-hash')).toThrow(TotemParseError);
|
|
329
|
+
});
|
|
330
|
+
it('throws TotemParseError when a valid hash points to a non-existent file (greptile P2, doc contract)', () => {
|
|
331
|
+
const missing = 'f'.repeat(64); // well-formed id, but no file on disk
|
|
332
|
+
expect(() => readPanelArtifact(totemDir, missing)).toThrow(TotemParseError);
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
//# sourceMappingURL=panel.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.test.js","sourceRoot":"","sources":["../../src/artifacts/panel.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The default deterministic post-check rule set (mmnto-ai/totem#2103, strategy#474
|
|
3
|
+
* slice 4). Each rule is zero-LLM and returns a verdict at its STATIC tier; the
|
|
4
|
+
* aggregator ({@link evaluatePostChecks}) owns rejection. Rule decomposition
|
|
5
|
+
* follows the cohort pre-build round (codex): the OutputContract's three knobs
|
|
6
|
+
* (`schema` / `citationsRequired` / `verifyFallback`) are distinct
|
|
7
|
+
* responsibilities, not one rule.
|
|
8
|
+
*
|
|
9
|
+
* Helpers (containment, citation extraction, line-range) are exported for
|
|
10
|
+
* direct unit testing — they are the load-bearing edge-case surface (agy).
|
|
11
|
+
*/
|
|
12
|
+
import { type PostCheckRule } from './post-checks.js';
|
|
13
|
+
/**
|
|
14
|
+
* Is `citedPath` a relative path nested inside `configRoot`? Rejects absolute
|
|
15
|
+
* paths and Windows drive-letters up front, normalizes separators BEFORE
|
|
16
|
+
* resolving (win32: `src\..\..\etc/passwd` must not slip), then requires the
|
|
17
|
+
* resolved path to stay under the root (agy review on mmnto-ai/totem#2103).
|
|
18
|
+
*/
|
|
19
|
+
export declare function isContained(configRoot: string, citedPath: string): boolean;
|
|
20
|
+
/** A parsed citation token: the path plus an optional 1-indexed line or line range. */
|
|
21
|
+
export interface Citation {
|
|
22
|
+
raw: string;
|
|
23
|
+
filePath: string;
|
|
24
|
+
line?: number;
|
|
25
|
+
endLine?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Conservatively extract `path` / `path:line` / `path:start-end` citations from
|
|
29
|
+
* backticked spans in `content`. Strips fenced code blocks first (their sample
|
|
30
|
+
* paths / command logs would false-fail), and ignores backticked tokens that
|
|
31
|
+
* carry neither a path separator nor a known extension — so `` `main` `` /
|
|
32
|
+
* `` `pnpm test` `` are not treated as citations (agy review on mmnto-ai/totem#2103).
|
|
33
|
+
*/
|
|
34
|
+
export declare function extractCitations(content: string): Citation[];
|
|
35
|
+
/**
|
|
36
|
+
* Is a citation's line reference valid against a file of `totalLines` lines?
|
|
37
|
+
* Path-only citations (no line) always pass the line check. 1-indexed; a range
|
|
38
|
+
* requires `0 < start <= end <= totalLines` (agy boundary matrix).
|
|
39
|
+
*/
|
|
40
|
+
export declare function lineRefValid(totalLines: number, line?: number, endLine?: number): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Structured-output contract (decidable, all callers). Absent `schema` ⇒
|
|
43
|
+
* abstain (prose output is never treated as malformed JSON). Present ⇒
|
|
44
|
+
* `output.content` must parse as JSON; non-JSON is a decidable fail. NOTE: deep
|
|
45
|
+
* JSON-Schema shape validation is a follow-on — core carries no validator
|
|
46
|
+
* dependency this slice, so the gate is parse-only (codex review: "non-JSON is
|
|
47
|
+
* a decidable fail").
|
|
48
|
+
*/
|
|
49
|
+
export declare const structuredOutputRule: PostCheckRule;
|
|
50
|
+
/**
|
|
51
|
+
* Citation resolution (decidable). Gates only when the caller declared
|
|
52
|
+
* `citationsRequired`. For each cited path: must be in-root, the file must
|
|
53
|
+
* exist, and any line reference must be in range. For a `review` run, a citation
|
|
54
|
+
* outside the delivered grounding bundle is also a fail (review cites what it was
|
|
55
|
+
* given). Claim *support* (does the cited text back the claim) stays sensor-only
|
|
56
|
+
* — out of scope here (ADR-109).
|
|
57
|
+
*
|
|
58
|
+
* Intentional overlap (CR #2177 review): on a `spec` run with `citationsRequired`,
|
|
59
|
+
* an unresolved path is ALSO flagged by spec-verify — both correctly fail it, so the
|
|
60
|
+
* report can carry two decidable findings for one path. The rules are independent by
|
|
61
|
+
* design (different escapes: spec-verify owns the `VERIFY:` fallback, this owns
|
|
62
|
+
* line-range + bundle membership); de-duplicating overlapping decidable fails belongs
|
|
63
|
+
* at the live-wiring / aggregation layer (#2104), not by coupling rules in this slice.
|
|
64
|
+
*/
|
|
65
|
+
export declare const citationResolvesRule: PostCheckRule;
|
|
66
|
+
/**
|
|
67
|
+
* Spec VERIFY requirement (decidable, caller `spec`). A spec that references a
|
|
68
|
+
* path which does not resolve on disk must mark it with `VERIFY:` — otherwise it
|
|
69
|
+
* is a fabricated path (the mmnto-ai/totem#2090/#2091 class). `VERIFY:` is accepted
|
|
70
|
+
* as the escape UNLESS the caller set `outputContract.verifyFallback === false`
|
|
71
|
+
* (the verify-fallback knob, folded here where `VERIFY:` is actually consumed —
|
|
72
|
+
* codex review).
|
|
73
|
+
*/
|
|
74
|
+
export declare const specVerifyRule: PostCheckRule;
|
|
75
|
+
/**
|
|
76
|
+
* Override-memory reappearance (decidable, caller `review`). A finding the
|
|
77
|
+
* operator dispositioned (rejected) must not reappear in a later review. The
|
|
78
|
+
* anchored-span key format lives in the store (mmnto-ai/totem#2105); this rule only
|
|
79
|
+
* asks the injected {@link OverrideSet} whether any reappears. Absent store ⇒
|
|
80
|
+
* abstain (the rule no-ops until #2105 wires a store).
|
|
81
|
+
*/
|
|
82
|
+
export declare const overrideReappearanceRule: PostCheckRule;
|
|
83
|
+
/**
|
|
84
|
+
* Provenance fail-safe-down sensor (SENSOR, all grounded runs; mmnto-ai/totem#2101
|
|
85
|
+
* F2 rider, enforcement test rides #2103). A grounding item whose `provenance`
|
|
86
|
+
* is not a canonical class is surfaced as NOT-upgraded (lowest trust). SENSOR
|
|
87
|
+
* tier: it is telemetry and can NEVER gate — an invented class must not confer,
|
|
88
|
+
* nor deny, trust by gating.
|
|
89
|
+
*/
|
|
90
|
+
export declare const provenanceSensorRule: PostCheckRule;
|
|
91
|
+
/** The default rule set, in execution order. */
|
|
92
|
+
export declare const DEFAULT_RULES: readonly PostCheckRule[];
|
|
93
|
+
//# sourceMappingURL=post-checks-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-checks-rules.d.ts","sourceRoot":"","sources":["../../src/artifacts/post-checks-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,kBAAkB,CAAC;AAoB1B;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAe1E;AAED,uFAAuF;AACvF,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAoB5D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAOzF;AAQD;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAmBlC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oBAAoB,EAAE,aA8ClC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,EAAE,aAqC5B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAkBtC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAkBlC,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,aAAa,EAAE,SAAS,aAAa,EAMjD,CAAC"}
|