@mmnto/totem 1.63.0 → 1.64.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.
Files changed (41) hide show
  1. package/dist/artifacts/panel.d.ts +1919 -0
  2. package/dist/artifacts/panel.d.ts.map +1 -0
  3. package/dist/artifacts/panel.js +503 -0
  4. package/dist/artifacts/panel.js.map +1 -0
  5. package/dist/artifacts/panel.test.d.ts +15 -0
  6. package/dist/artifacts/panel.test.d.ts.map +1 -0
  7. package/dist/artifacts/panel.test.js +335 -0
  8. package/dist/artifacts/panel.test.js.map +1 -0
  9. package/dist/artifacts/post-checks-rules.d.ts +93 -0
  10. package/dist/artifacts/post-checks-rules.d.ts.map +1 -0
  11. package/dist/artifacts/post-checks-rules.js +307 -0
  12. package/dist/artifacts/post-checks-rules.js.map +1 -0
  13. package/dist/artifacts/post-checks-rules.test.d.ts +9 -0
  14. package/dist/artifacts/post-checks-rules.test.d.ts.map +1 -0
  15. package/dist/artifacts/post-checks-rules.test.js +258 -0
  16. package/dist/artifacts/post-checks-rules.test.js.map +1 -0
  17. package/dist/artifacts/post-checks.d.ts +102 -0
  18. package/dist/artifacts/post-checks.d.ts.map +1 -0
  19. package/dist/artifacts/post-checks.js +80 -0
  20. package/dist/artifacts/post-checks.js.map +1 -0
  21. package/dist/artifacts/post-checks.test.d.ts +12 -0
  22. package/dist/artifacts/post-checks.test.d.ts.map +1 -0
  23. package/dist/artifacts/post-checks.test.js +103 -0
  24. package/dist/artifacts/post-checks.test.js.map +1 -0
  25. package/dist/index.d.ts +6 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/ingest/pipeline.d.ts +10 -0
  30. package/dist/ingest/pipeline.d.ts.map +1 -1
  31. package/dist/ingest/pipeline.js +52 -8
  32. package/dist/ingest/pipeline.js.map +1 -1
  33. package/dist/ingest/pipeline.test.js +27 -21
  34. package/dist/ingest/pipeline.test.js.map +1 -1
  35. package/dist/store/lance-store.d.ts +11 -0
  36. package/dist/store/lance-store.d.ts.map +1 -1
  37. package/dist/store/lance-store.js +30 -0
  38. package/dist/store/lance-store.js.map +1 -1
  39. package/dist/store/lance-store.test.js +20 -0
  40. package/dist/store/lance-store.test.js.map +1 -1
  41. 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"}