@mmnto/totem 1.67.1 → 1.69.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.
- package/dist/capability/falsification.d.ts +18 -0
- package/dist/capability/falsification.d.ts.map +1 -0
- package/dist/capability/falsification.js +56 -0
- package/dist/capability/falsification.js.map +1 -0
- package/dist/capability/falsification.test.d.ts +2 -0
- package/dist/capability/falsification.test.d.ts.map +1 -0
- package/dist/capability/falsification.test.js +112 -0
- package/dist/capability/falsification.test.js.map +1 -0
- package/dist/capability/regenerate.d.ts +20 -0
- package/dist/capability/regenerate.d.ts.map +1 -0
- package/dist/capability/regenerate.js +0 -0
- package/dist/capability/regenerate.js.map +1 -0
- package/dist/capability/regenerate.test.d.ts +2 -0
- package/dist/capability/regenerate.test.d.ts.map +1 -0
- package/dist/capability/regenerate.test.js +136 -0
- package/dist/capability/regenerate.test.js.map +1 -0
- package/dist/capability/review-catch.d.ts +53 -0
- package/dist/capability/review-catch.d.ts.map +1 -0
- package/dist/capability/review-catch.js +92 -0
- package/dist/capability/review-catch.js.map +1 -0
- package/dist/capability/review-catch.test.d.ts +2 -0
- package/dist/capability/review-catch.test.d.ts.map +1 -0
- package/dist/capability/review-catch.test.js +90 -0
- package/dist/capability/review-catch.test.js.map +1 -0
- package/dist/capability/schema.d.ts +244 -0
- package/dist/capability/schema.d.ts.map +1 -0
- package/dist/capability/schema.js +141 -0
- package/dist/capability/schema.js.map +1 -0
- package/dist/capability/schema.test.d.ts +2 -0
- package/dist/capability/schema.test.d.ts.map +1 -0
- package/dist/capability/schema.test.js +93 -0
- package/dist/capability/schema.test.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/spine/candidate-rule.d.ts +84 -0
- package/dist/spine/candidate-rule.d.ts.map +1 -0
- package/dist/spine/candidate-rule.js +68 -0
- package/dist/spine/candidate-rule.js.map +1 -0
- package/dist/spine/candidate-rule.test.d.ts +2 -0
- package/dist/spine/candidate-rule.test.d.ts.map +1 -0
- package/dist/spine/candidate-rule.test.js +40 -0
- package/dist/spine/candidate-rule.test.js.map +1 -0
- package/dist/spine/classify.d.ts +93 -0
- package/dist/spine/classify.d.ts.map +1 -0
- package/dist/spine/classify.js +190 -0
- package/dist/spine/classify.js.map +1 -0
- package/dist/spine/classify.test.d.ts +2 -0
- package/dist/spine/classify.test.d.ts.map +1 -0
- package/dist/spine/classify.test.js +302 -0
- package/dist/spine/classify.test.js.map +1 -0
- package/dist/spine/compile.d.ts +62 -0
- package/dist/spine/compile.d.ts.map +1 -0
- package/dist/spine/compile.js +204 -0
- package/dist/spine/compile.js.map +1 -0
- package/dist/spine/compile.test.d.ts +2 -0
- package/dist/spine/compile.test.d.ts.map +1 -0
- package/dist/spine/compile.test.js +327 -0
- package/dist/spine/compile.test.js.map +1 -0
- package/dist/spine/extract.d.ts +146 -0
- package/dist/spine/extract.d.ts.map +1 -0
- package/dist/spine/extract.js +227 -0
- package/dist/spine/extract.js.map +1 -0
- package/dist/spine/extract.test.d.ts +2 -0
- package/dist/spine/extract.test.d.ts.map +1 -0
- package/dist/spine/extract.test.js +382 -0
- package/dist/spine/extract.test.js.map +1 -0
- package/dist/spine/ledgers.d.ts +1102 -0
- package/dist/spine/ledgers.d.ts.map +1 -0
- package/dist/spine/ledgers.js +209 -0
- package/dist/spine/ledgers.js.map +1 -0
- package/dist/spine/miner-harness.d.ts +30 -0
- package/dist/spine/miner-harness.d.ts.map +1 -0
- package/dist/spine/miner-harness.js +214 -0
- package/dist/spine/miner-harness.js.map +1 -0
- package/dist/spine/miner-harness.test.d.ts +2 -0
- package/dist/spine/miner-harness.test.d.ts.map +1 -0
- package/dist/spine/miner-harness.test.js +231 -0
- package/dist/spine/miner-harness.test.js.map +1 -0
- package/dist/spine/split.d.ts +149 -0
- package/dist/spine/split.d.ts.map +1 -0
- package/dist/spine/split.js +235 -0
- package/dist/spine/split.js.map +1 -0
- package/dist/spine/split.test.d.ts +2 -0
- package/dist/spine/split.test.d.ts.map +1 -0
- package/dist/spine/split.test.js +142 -0
- package/dist/spine/split.test.js.map +1 -0
- package/dist/spine/windtunnel-lock.d.ts +8 -8
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/spine/classify.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,gFAAgF;AAChF,kFAAkF;AAClF,wEAAwE;AACxE,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,mDAAmD;AACnD,EAAE;AACF,kFAAkF;AAClF,+EAA+E;AAC/E,6EAA6E;AAC7E,sCAAsC;AACtC,EAAE;AACF,2CAA2C;AAC3C,+EAA+E;AAC/E,qFAAqF;AACrF,iFAAiF;AACjF,gFAAgF;AAChF,oEAAoE;AACpE,mFAAmF;AACnF,mFAAmF;AACnF,8EAA8E;AAC9E,oFAAoF;AACpF,mFAAmF;AACnF,kFAAkF;AAClF,kFAAkF;AAClF,EAAE;AACF,+EAA+E;AAC/E,4EAA4E;AAC5E,mFAAmF;AACnF,iFAAiF;AAEjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAEL,yBAAyB,EAEzB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,sBAAsB,EACtB,uBAAuB,EAGvB,oBAAoB,EAEpB,kBAAkB,GAGnB,MAAM,cAAc,CAAC;AAEtB,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACpC,MAAM,CAAC;IACN,WAAW,EAAE,2BAA2B;IACxC,iBAAiB,EAAE,uBAAuB;CAC3C,CAAC;KACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,KAAK,eAAe,IAAI,CAAC,CAAC,WAAW,KAAK,YAAY,EAAE;IACxF,gFAAgF;IAChF,gFAAgF;IAChF,uEAAuE;IACvE,iFAAiF;IACjF,OAAO,EACL,mJAAmJ;IACrJ,IAAI,EAAE,CAAC,aAAa,CAAC;CACtB,CAAC,CAAC;AAsCL,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAkC;IACrE,OAAO,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;AAC/D,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc,EAAE,KAAa;IACrD,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACvC,+EAA+E;QAC/E,8EAA8E;QAC9E,MAAM,IAAI,KAAK,CAAC,6CAA6C,KAAK,aAAa,IAAI,GAAG,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,kFAAkF;AAElF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA2B,EAC3B,WAAwB,EACxB,IAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,WAAW,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAC/E,CAAC;IAEF,MAAM,UAAU,GAA0B,EAAE,CAAC;IAC7C,MAAM,eAAe,GAA0B,EAAE,CAAC;IAClD,MAAM,iBAAiB,GAAgC,EAAE,CAAC;IAC1D,2EAA2E;IAC3E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE9C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;QAErC,+EAA+E;QAC/E,gFAAgF;QAChF,2EAA2E;QAC3E,6EAA6E;QAC7E,kFAAkF;QAClF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,wDAAwD,EAAE,4EAA4E,CACvI,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,yFAAyF,EAAE,EAAE,CAC9F,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,sEAAsE,EAAE,0DAA0D,CACnI,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACzC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QACjC,MAAM,YAAY,GAAG,QAAQ,EAAE,IAAI,OAAO,EAAE,CAAC;QAC7C,MAAM,mBAAmB,GAAG,OAAO,EAAE,IAAI,OAAO,EAAE,CAAC;QAEnD,8EAA8E;QAC9E,2EAA2E;QAC3E,qEAAqE;QACrE,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEzD,gFAAgF;QAChF,gFAAgF;QAChF,MAAM,SAAS,GAAG,yBAAyB,CAAC,KAAK,CAAC;YAChD,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,qBAAqB,EAAE,MAAM,CAAC,WAAW;YACzC,mBAAmB;YACnB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE3B,eAAe,CAAC,IAAI,CAAC;YACnB,YAAY;YACZ,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,qBAAqB,EAAE,MAAM,CAAC,WAAW;YACzC,OAAO;YACP,mBAAmB;YACnB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,iBAAiB,CAAC,IAAI,CAAC;YACrB,8EAA8E;YAC9E,YAAY,EAAE,mBAAmB;YACjC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,iFAAiF;YACjF,eAAe,EAAE,KAAK;YACtB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,+EAA+E;IAC/E,mFAAmF;IACnF,gFAAgF;IAChF,IACE,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM;QAC3C,eAAe,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM;QAChD,iBAAiB,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAClD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,kEAAkE,OAAO,CAAC,MAAM,CAAC,MAAM,gBAAgB,UAAU,CAAC,MAAM,cAAc,eAAe,CAAC,MAAM,gBAAgB,iBAAiB,CAAC,MAAM,GAAG,CACxM,CAAC;IACJ,CAAC;IACD,gBAAgB,CACd,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,EAC1C,cAAc,CACf,CAAC;IACF,gBAAgB,CACd,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,EAC5C,qBAAqB,CACtB,CAAC;IAEF,gFAAgF;IAChF,+EAA+E;IAC/E,MAAM,cAAc,GAAG,oBAAoB,CAAC,KAAK,CAAC;QAChD,OAAO,EAAE,eAAe;QACxB,2BAA2B,EAAE;YAC3B,mBAAmB,EAAE,OAAO,CAAC,aAAa,CAAC,mBAAmB;SAC/D;KACF,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAEtF,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAwB,EACxB,OAA2B,EAC3B,QAA6B;IAE7B,OAAO,kBAAkB,CAAC,KAAK,CAAC;QAC9B,QAAQ,EAAE,QAAQ,CAAC,cAAc;QACjC,IAAI,EAAE,OAAO,CAAC,UAAU;QACxB,UAAU,EAAE,QAAQ,CAAC,gBAAgB;QACrC,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,OAAO,CAAC,cAAc;KACjC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.test.d.ts","sourceRoot":"","sources":["../../src/spine/classify.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { assembleMinerLedgers, dispositionToRouting, runClassifyStage, } from './classify.js';
|
|
3
|
+
import { runFalsificationHarness } from './miner-harness.js';
|
|
4
|
+
const sha = (n) => String(n).padStart(40, '0');
|
|
5
|
+
// ── Fixtures ──────────────────────────────────────────────────────────────────
|
|
6
|
+
function draft(pr, dslSource) {
|
|
7
|
+
return { provenance: { mergedPr: pr, reviewThread: `rt-${pr}`, commitSha: sha(pr) }, dslSource };
|
|
8
|
+
}
|
|
9
|
+
const STRUCT = '**Pattern:** no-foo'; // marker the dsl-keyed fixture classifier reads as structural
|
|
10
|
+
const BEHAVE = 'prefer X over Y (a behavioral lesson)';
|
|
11
|
+
const asStructural = {
|
|
12
|
+
disposition: 'structural',
|
|
13
|
+
dispositionSource: 'classified',
|
|
14
|
+
};
|
|
15
|
+
const asBehavioral = {
|
|
16
|
+
disposition: 'behavioral',
|
|
17
|
+
dispositionSource: 'classified',
|
|
18
|
+
};
|
|
19
|
+
const asErrorDefault = {
|
|
20
|
+
disposition: 'behavioral',
|
|
21
|
+
dispositionSource: 'error-default',
|
|
22
|
+
};
|
|
23
|
+
function classifierBy(fn) {
|
|
24
|
+
return { classify: (d) => Promise.resolve(fn(d)) };
|
|
25
|
+
}
|
|
26
|
+
const always = (r) => classifierBy(() => r);
|
|
27
|
+
/** Classify by a marker in the dsl body — structural iff it carries a `**Pattern:**`. */
|
|
28
|
+
const markerClassifier = classifierBy((d) => d.dslSource.includes('Pattern:') ? asStructural : asBehavioral);
|
|
29
|
+
/** A frozen split ledger: train [1,2], heldOut [3,4] (controls 3/4), corpus [1..4]. */
|
|
30
|
+
function splitLedger() {
|
|
31
|
+
return {
|
|
32
|
+
split: {
|
|
33
|
+
asOfCommit: sha(100),
|
|
34
|
+
trainPrs: [1, 2],
|
|
35
|
+
heldOutPrs: [3, 4],
|
|
36
|
+
excludedPrs: [],
|
|
37
|
+
positiveControlPrs: [3],
|
|
38
|
+
negativeControlPrs: [4],
|
|
39
|
+
splitRule: { predicate: 'code-touching non-bot', cutIndex: 2 },
|
|
40
|
+
},
|
|
41
|
+
corpus: [1, 2, 3, 4],
|
|
42
|
+
corpusMergeCommits: [1, 2, 3, 4].map((pr) => ({ pr, mergeCommit: sha(pr) })),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** A slice-2 Extract result: train fetches derived from the drafts, no held-out fetch. */
|
|
46
|
+
function extractResult(opts) {
|
|
47
|
+
const fetchedPrs = [...new Set(opts.drafts.map((d) => d.provenance.mergedPr))].sort((a, b) => a - b);
|
|
48
|
+
return {
|
|
49
|
+
drafts: opts.drafts,
|
|
50
|
+
dropLedger: { entries: opts.drops ?? [] },
|
|
51
|
+
apiUsageLedger: {
|
|
52
|
+
entries: fetchedPrs.map((pr) => ({
|
|
53
|
+
targetPr: pr,
|
|
54
|
+
slice: 'train',
|
|
55
|
+
fetchKind: 'review-thread',
|
|
56
|
+
})),
|
|
57
|
+
heldOutFetchCount: 0,
|
|
58
|
+
},
|
|
59
|
+
seedBlindness: { seedClassesProvided: opts.seed ?? false },
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const clone = (x) => JSON.parse(JSON.stringify(x));
|
|
63
|
+
const clauses = (raw) => [...new Set(runFalsificationHarness(raw).violations.map((v) => v.clause))].sort();
|
|
64
|
+
// ── dispositionToRouting ────────────────────────────────────────────────────
|
|
65
|
+
describe('dispositionToRouting', () => {
|
|
66
|
+
it('maps structural → compile and behavioral → rag-only', () => {
|
|
67
|
+
expect(dispositionToRouting('structural')).toBe('compile');
|
|
68
|
+
expect(dispositionToRouting('behavioral')).toBe('rag-only');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
// ── Mint fidelity + ledgers ──────────────────────────────────────────────────
|
|
72
|
+
describe('runClassifyStage — mint + ledgers', () => {
|
|
73
|
+
it('mints a structural candidate: compile routing, classified ledger entry, unverified, verbatim carry', async () => {
|
|
74
|
+
const d = draft(1, STRUCT);
|
|
75
|
+
const r = await runClassifyStage(extractResult({ drafts: [d] }), splitLedger(), {
|
|
76
|
+
classifier: always(asStructural),
|
|
77
|
+
});
|
|
78
|
+
expect(r.candidates).toHaveLength(1);
|
|
79
|
+
const c = r.candidates[0];
|
|
80
|
+
expect(c.classifierDisposition).toBe('structural');
|
|
81
|
+
expect(c.unverified).toBe(true);
|
|
82
|
+
expect(c.dslSource).toBe(STRUCT); // byte-verbatim
|
|
83
|
+
expect(c.provenance).toEqual(d.provenance); // byte-verbatim
|
|
84
|
+
expect(c.classifierLedgerRef).toBe('clr-1-0');
|
|
85
|
+
expect(r.emissionLedger.entries).toEqual([
|
|
86
|
+
{
|
|
87
|
+
candidateRef: 'cand-1-0',
|
|
88
|
+
provenance: d.provenance,
|
|
89
|
+
classifierDisposition: 'structural',
|
|
90
|
+
routing: 'compile',
|
|
91
|
+
classifierLedgerRef: 'clr-1-0',
|
|
92
|
+
unverified: true,
|
|
93
|
+
},
|
|
94
|
+
]);
|
|
95
|
+
expect(r.classifierLedger.entries).toEqual([
|
|
96
|
+
{
|
|
97
|
+
candidateRef: 'clr-1-0',
|
|
98
|
+
disposition: 'structural',
|
|
99
|
+
stage4Confirmed: false,
|
|
100
|
+
dispositionSource: 'classified',
|
|
101
|
+
},
|
|
102
|
+
]);
|
|
103
|
+
});
|
|
104
|
+
it('mints a behavioral candidate with rag-only routing (never compiled)', async () => {
|
|
105
|
+
const r = await runClassifyStage(extractResult({ drafts: [draft(1, BEHAVE)] }), splitLedger(), {
|
|
106
|
+
classifier: always(asBehavioral),
|
|
107
|
+
});
|
|
108
|
+
expect(r.candidates[0].classifierDisposition).toBe('behavioral');
|
|
109
|
+
expect(r.emissionLedger.entries[0].routing).toBe('rag-only');
|
|
110
|
+
});
|
|
111
|
+
it('join holds: every emission classifierLedgerRef resolves to a classifier entry with the same disposition', async () => {
|
|
112
|
+
const r = await runClassifyStage(extractResult({ drafts: [draft(1, STRUCT), draft(2, BEHAVE)] }), splitLedger(), { classifier: markerClassifier });
|
|
113
|
+
const byRef = new Map(r.classifierLedger.entries.map((e) => [e.candidateRef, e]));
|
|
114
|
+
for (const e of r.emissionLedger.entries) {
|
|
115
|
+
const attesting = byRef.get(e.classifierLedgerRef);
|
|
116
|
+
expect(attesting).toBeDefined();
|
|
117
|
+
expect(attesting?.disposition).toBe(e.classifierDisposition);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
it('threads the run-level seed-blindness fact from Extract into the emission ledger (single home)', async () => {
|
|
121
|
+
const blind = await runClassifyStage(extractResult({ drafts: [draft(1, STRUCT)] }), splitLedger(), {
|
|
122
|
+
classifier: always(asStructural),
|
|
123
|
+
});
|
|
124
|
+
expect(blind.emissionLedger.extractionInputsAttestation.seedClassesProvided).toBe(false);
|
|
125
|
+
const seeded = await runClassifyStage(extractResult({ drafts: [draft(1, STRUCT)], seed: true }), splitLedger(), { classifier: always(asStructural) });
|
|
126
|
+
expect(seeded.emissionLedger.extractionInputsAttestation.seedClassesProvided).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
// ── 1:1 minting, refs, no dedup ──────────────────────────────────────────────
|
|
130
|
+
describe('runClassifyStage — 1:1 minting + deterministic refs', () => {
|
|
131
|
+
it('mints N distinct candidates from one PR with distinct refs and NO dslSource dedup', async () => {
|
|
132
|
+
// Two drafts from PR 1 with IDENTICAL dslSource must stay two distinct candidates.
|
|
133
|
+
const r = await runClassifyStage(extractResult({ drafts: [draft(1, STRUCT), draft(1, STRUCT)] }), splitLedger(), { classifier: always(asStructural) });
|
|
134
|
+
expect(r.candidates).toHaveLength(2);
|
|
135
|
+
expect(r.emissionLedger.entries.map((e) => e.candidateRef)).toEqual(['cand-1-0', 'cand-1-1']);
|
|
136
|
+
expect(r.classifierLedger.entries.map((e) => e.candidateRef)).toEqual(['clr-1-0', 'clr-1-1']);
|
|
137
|
+
// No dedup: both carry the identical dslSource.
|
|
138
|
+
expect(r.candidates.every((c) => c.dslSource === STRUCT)).toBe(true);
|
|
139
|
+
});
|
|
140
|
+
it('keeps 1:1 across drafts: candidates == emission == classifier == drafts', async () => {
|
|
141
|
+
const drafts = [draft(1, STRUCT), draft(1, BEHAVE), draft(2, STRUCT)];
|
|
142
|
+
const r = await runClassifyStage(extractResult({ drafts }), splitLedger(), {
|
|
143
|
+
classifier: markerClassifier,
|
|
144
|
+
});
|
|
145
|
+
expect(r.candidates).toHaveLength(drafts.length);
|
|
146
|
+
expect(r.emissionLedger.entries).toHaveLength(drafts.length);
|
|
147
|
+
expect(r.classifierLedger.entries).toHaveLength(drafts.length);
|
|
148
|
+
});
|
|
149
|
+
it('emits empty ledgers (attestation present) when there are no drafts', async () => {
|
|
150
|
+
const r = await runClassifyStage(extractResult({ drafts: [] }), splitLedger(), {
|
|
151
|
+
classifier: always(asStructural),
|
|
152
|
+
});
|
|
153
|
+
expect(r.candidates).toEqual([]);
|
|
154
|
+
expect(r.emissionLedger.entries).toEqual([]);
|
|
155
|
+
expect(r.classifierLedger.entries).toEqual([]);
|
|
156
|
+
expect(r.emissionLedger.extractionInputsAttestation).toEqual({ seedClassesProvided: false });
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
// ── Safe-default + error contracts ───────────────────────────────────────────
|
|
160
|
+
describe('runClassifyStage — safe-default + fail-loud error contracts', () => {
|
|
161
|
+
it('records a safe-default behavioral as error-default and NEVER compile-routes it', async () => {
|
|
162
|
+
const r = await runClassifyStage(extractResult({ drafts: [draft(1, STRUCT)] }), splitLedger(), {
|
|
163
|
+
classifier: always(asErrorDefault),
|
|
164
|
+
});
|
|
165
|
+
expect(r.candidates[0].classifierDisposition).toBe('behavioral');
|
|
166
|
+
expect(r.emissionLedger.entries[0].routing).toBe('rag-only');
|
|
167
|
+
expect(r.classifierLedger.entries[0].dispositionSource).toBe('error-default');
|
|
168
|
+
// The low-privilege guarantee: a failed classification is never structural/compile.
|
|
169
|
+
expect(r.emissionLedger.entries[0].routing).not.toBe('compile');
|
|
170
|
+
});
|
|
171
|
+
it('propagates a contract-violating classifier throw loudly (no core swallow)', async () => {
|
|
172
|
+
const throwing = {
|
|
173
|
+
classify: async () => {
|
|
174
|
+
throw new Error('classifier adapter boom');
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
await expect(runClassifyStage(extractResult({ drafts: [draft(1, STRUCT)] }), splitLedger(), {
|
|
178
|
+
classifier: throwing,
|
|
179
|
+
})).rejects.toThrow('classifier adapter boom');
|
|
180
|
+
});
|
|
181
|
+
it('fails loud on a non-enum classifier result BEFORE routing/mint', async () => {
|
|
182
|
+
const bogus = {
|
|
183
|
+
classify: () => Promise.resolve({
|
|
184
|
+
disposition: 'sideways',
|
|
185
|
+
dispositionSource: 'classified',
|
|
186
|
+
}),
|
|
187
|
+
};
|
|
188
|
+
await expect(runClassifyStage(extractResult({ drafts: [draft(1, STRUCT)] }), splitLedger(), {
|
|
189
|
+
classifier: bogus,
|
|
190
|
+
})).rejects.toThrow();
|
|
191
|
+
});
|
|
192
|
+
it('rejects an error-default paired with a structural disposition (safe-default must be low-privilege)', async () => {
|
|
193
|
+
// A buggy adapter must not be able to compile-route a failure default: the
|
|
194
|
+
// ClassifierResultSchema refine rejects `{ structural, error-default }` before routing.
|
|
195
|
+
const inconsistent = {
|
|
196
|
+
classify: () => Promise.resolve({ disposition: 'structural', dispositionSource: 'error-default' }),
|
|
197
|
+
};
|
|
198
|
+
await expect(runClassifyStage(extractResult({ drafts: [draft(1, STRUCT)] }), splitLedger(), {
|
|
199
|
+
classifier: inconsistent,
|
|
200
|
+
})).rejects.toThrow();
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
// ── Fail-loud provenance re-check (FM(e-emission) at the stage boundary) ──────
|
|
204
|
+
describe('runClassifyStage — fail-loud provenance re-check', () => {
|
|
205
|
+
it('throws on a draft sourced from a non-train PR (forged/leaked draft)', async () => {
|
|
206
|
+
await expect(runClassifyStage(extractResult({ drafts: [draft(99, STRUCT)] }), splitLedger(), {
|
|
207
|
+
classifier: always(asStructural),
|
|
208
|
+
})).rejects.toThrow(/not in the frozen train slice/);
|
|
209
|
+
});
|
|
210
|
+
it('throws on a draft whose commitSha does not match the PR frozen merge commit', async () => {
|
|
211
|
+
const forged = {
|
|
212
|
+
provenance: { mergedPr: 1, reviewThread: 'rt-1', commitSha: sha(99) },
|
|
213
|
+
dslSource: STRUCT,
|
|
214
|
+
};
|
|
215
|
+
await expect(runClassifyStage(extractResult({ drafts: [forged] }), splitLedger(), {
|
|
216
|
+
classifier: always(asStructural),
|
|
217
|
+
})).rejects.toThrow(/frozen merge commit/);
|
|
218
|
+
});
|
|
219
|
+
it('throws when the split ledger has no frozen merge commit for a train PR (unvalidated cover)', async () => {
|
|
220
|
+
// Cover-validity is the harness's job, not the SplitLedger schema's — so a caller
|
|
221
|
+
// can hand in a SplitLedger whose corpusMergeCommits omits a train PR. The stage
|
|
222
|
+
// must fail loud rather than mint a candidate with no frozen-SHA anchor.
|
|
223
|
+
const sl = splitLedger();
|
|
224
|
+
const holey = {
|
|
225
|
+
...sl,
|
|
226
|
+
corpusMergeCommits: sl.corpusMergeCommits.filter((e) => e.pr !== 1),
|
|
227
|
+
};
|
|
228
|
+
await expect(runClassifyStage(extractResult({ drafts: [draft(1, STRUCT)] }), holey, {
|
|
229
|
+
classifier: always(asStructural),
|
|
230
|
+
})).rejects.toThrow(/no frozen merge commit/);
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
// ── Determinism ──────────────────────────────────────────────────────────────
|
|
234
|
+
describe('runClassifyStage — determinism', () => {
|
|
235
|
+
it('produces identical output for identical inputs + a fixed classifier', async () => {
|
|
236
|
+
const drafts = [draft(1, STRUCT), draft(2, BEHAVE), draft(1, BEHAVE)];
|
|
237
|
+
const r1 = await runClassifyStage(extractResult({ drafts }), splitLedger(), {
|
|
238
|
+
classifier: markerClassifier,
|
|
239
|
+
});
|
|
240
|
+
const r2 = await runClassifyStage(extractResult({ drafts }), splitLedger(), {
|
|
241
|
+
classifier: markerClassifier,
|
|
242
|
+
});
|
|
243
|
+
expect(r1).toEqual(r2);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
// ── End-to-end: real producer output through the §8 harness ──────────────────
|
|
247
|
+
describe('assembleMinerLedgers + harness — real producer output', () => {
|
|
248
|
+
async function greenAssembled(seed = false) {
|
|
249
|
+
const sl = splitLedger();
|
|
250
|
+
// Cover BOTH train PRs (1 structural, 2 behavioral) so FM(i) is satisfied.
|
|
251
|
+
const extract = extractResult({ drafts: [draft(1, STRUCT), draft(2, BEHAVE)], seed });
|
|
252
|
+
const classify = await runClassifyStage(extract, sl, {
|
|
253
|
+
classifier: markerClassifier,
|
|
254
|
+
});
|
|
255
|
+
return assembleMinerLedgers(sl, extract, classify);
|
|
256
|
+
}
|
|
257
|
+
it('a real extract+classify run is contract-clean (no FM clause holds)', async () => {
|
|
258
|
+
const r = runFalsificationHarness(await greenAssembled());
|
|
259
|
+
expect(r.ok).toBe(true);
|
|
260
|
+
expect(r.violations).toEqual([]);
|
|
261
|
+
});
|
|
262
|
+
it('a seeded run trips FM(f) end-to-end (real serialized attestation)', async () => {
|
|
263
|
+
expect(clauses(await greenAssembled(true))).toEqual(['f']);
|
|
264
|
+
});
|
|
265
|
+
it('tampering a behavioral candidate to compile-route trips FM(c)', async () => {
|
|
266
|
+
const t = clone(await greenAssembled());
|
|
267
|
+
t.emission.entries[1].routing = 'compile'; // PR2 is behavioral
|
|
268
|
+
expect(clauses(t)).toEqual(['c']);
|
|
269
|
+
});
|
|
270
|
+
it('a candidate forged onto a held-out PR trips FM(e-emission)', async () => {
|
|
271
|
+
const t = clone(await greenAssembled());
|
|
272
|
+
t.emission.entries.push({
|
|
273
|
+
candidateRef: 'cand-3-0',
|
|
274
|
+
provenance: { mergedPr: 3, reviewThread: 'rt-3', commitSha: sha(3) }, // PR 3 is held-out
|
|
275
|
+
classifierDisposition: 'structural',
|
|
276
|
+
routing: 'compile',
|
|
277
|
+
classifierLedgerRef: 'clr-3-0',
|
|
278
|
+
unverified: true,
|
|
279
|
+
});
|
|
280
|
+
t.classifier.entries.push({
|
|
281
|
+
candidateRef: 'clr-3-0',
|
|
282
|
+
disposition: 'structural',
|
|
283
|
+
stage4Confirmed: false,
|
|
284
|
+
dispositionSource: 'classified',
|
|
285
|
+
});
|
|
286
|
+
expect(clauses(t)).toEqual(['e-emission']);
|
|
287
|
+
});
|
|
288
|
+
it('dropping a train PR from emission (no drop) trips FM(i)', async () => {
|
|
289
|
+
const t = clone(await greenAssembled());
|
|
290
|
+
t.emission.entries.splice(1, 1); // remove the PR 2 candidate without dropping it
|
|
291
|
+
expect(clauses(t)).toEqual(['i']);
|
|
292
|
+
});
|
|
293
|
+
it('a malformed real ledger maps to FM(a) (incomplete provenance) and FM(b) (non-unverified)', async () => {
|
|
294
|
+
const a = clone(await greenAssembled());
|
|
295
|
+
delete a.emission.entries[0].provenance.commitSha;
|
|
296
|
+
expect(clauses(a)).toContain('a');
|
|
297
|
+
const b = clone(await greenAssembled());
|
|
298
|
+
b.emission.entries[0].unverified = false;
|
|
299
|
+
expect(clauses(b)).toContain('b');
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
//# sourceMappingURL=classify.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.test.js","sourceRoot":"","sources":["../../src/spine/classify.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type CompiledRule, type ProvenanceRecord } from '../compiler-schema.js';
|
|
2
|
+
import { type Stage4Baseline, type Stage4VerificationResult, type Stage4VerifierDeps } from '../stage4-verifier.js';
|
|
3
|
+
import type { CandidateRuleRecord } from './candidate-rule.js';
|
|
4
|
+
import type { ClassifyStageResult } from './classify.js';
|
|
5
|
+
import type { ClassifierLedger } from './ledgers.js';
|
|
6
|
+
/**
|
|
7
|
+
* The slice-4 output: a compiled, Stage-4-verified candidate. Carries `provenance`
|
|
8
|
+
* UN-PROJECTED (slice 5 projects it into `legitimacy.provenance` when it stamps the
|
|
9
|
+
* wind-tunnel verdict) and the full `stage4` payload (so the `no-matches` vs
|
|
10
|
+
* `out-of-scope` distinction survives downstream — codex). The `rule` is
|
|
11
|
+
* `unverified: true`, `legitimacy`/`ruleClass`-free, never `manual`.
|
|
12
|
+
*/
|
|
13
|
+
export interface CompiledCandidate {
|
|
14
|
+
provenance: ProvenanceRecord;
|
|
15
|
+
classifierLedgerRef: string;
|
|
16
|
+
rule: CompiledRule;
|
|
17
|
+
stage4: Stage4VerificationResult;
|
|
18
|
+
}
|
|
19
|
+
/** Pure compile outcome (no IO): a compiled rule, or a loud per-engine validation rejection. */
|
|
20
|
+
export type CompileOutcome = {
|
|
21
|
+
kind: 'compiled';
|
|
22
|
+
rule: CompiledRule;
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'rejected';
|
|
25
|
+
reason: string;
|
|
26
|
+
};
|
|
27
|
+
export interface CompileStageDeps {
|
|
28
|
+
stage4: Stage4VerifierDeps;
|
|
29
|
+
/** Injected timestamp — no `new Date()` in core (Tenet 15 determinism, OQ1). */
|
|
30
|
+
now: string;
|
|
31
|
+
/** Stage-4 baseline; defaults to `getDefaultBaseline()` (test/fixture globs). */
|
|
32
|
+
baseline?: Stage4Baseline;
|
|
33
|
+
}
|
|
34
|
+
export interface CompileStageResult {
|
|
35
|
+
compiled: CompiledCandidate[];
|
|
36
|
+
/** The classifier ledger with `stage4Confirmed` + `stage4Outcome` filled on every compile-routed entry. */
|
|
37
|
+
classifierLedger: ClassifierLedger;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Compile a single compile-routed candidate's `dslSource` into a `CompiledRule`.
|
|
41
|
+
* PURE (no IO). Throws — fail loud, never a silent skip — on a behavioral candidate
|
|
42
|
+
* (FM(c) code backstop) or a structural candidate whose `dslSource` yields no usable
|
|
43
|
+
* pattern (a producer-contract violation: slice-2's `isUsableDsl` preflight should
|
|
44
|
+
* have prevented emission, so this surfaces a preflight↔parser desync). Returns a
|
|
45
|
+
* `rejected` outcome (NOT a throw) when the pattern parses but fails per-engine
|
|
46
|
+
* safety validation (e.g. ReDoS) — a counted, reported `compile-rejected` state.
|
|
47
|
+
*/
|
|
48
|
+
export declare function compileCandidate(candidate: CandidateRuleRecord, opts: {
|
|
49
|
+
now: string;
|
|
50
|
+
}): CompileOutcome;
|
|
51
|
+
/**
|
|
52
|
+
* Run the Stage-3 Compile + Stage-4 Verify stage over a classify result. Selects
|
|
53
|
+
* ONLY compile-routed (structural) candidates and compiles them SEQUENTIALLY in
|
|
54
|
+
* stable classify-output order (deterministic ordinals before any async reorder).
|
|
55
|
+
* Returns the `CompiledCandidate[]` + the classifier ledger with `stage4Confirmed`
|
|
56
|
+
* and `stage4Outcome` filled on every compile-routed entry (behavioral/rag-only
|
|
57
|
+
* entries are left untouched). Mutates nothing: returns a new ledger object with a
|
|
58
|
+
* new entries array — updated entries are spread copies, unmodified entries share
|
|
59
|
+
* the original reference (a structural copy, not a deep copy).
|
|
60
|
+
*/
|
|
61
|
+
export declare function runCompileStage(classify: ClassifyStageResult, deps: CompileStageDeps): Promise<CompileStageResult>;
|
|
62
|
+
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/spine/compile.ts"],"names":[],"mappings":"AAyBA,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EAExB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,cAAc,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,wBAAwB,CAAC;CAClC;AAED,gGAAgG;AAChG,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,2GAA2G;IAC3G,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAOD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,mBAAmB,EAC9B,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GACpB,cAAc,CAgDhB;AA6DD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,mBAAmB,EAC7B,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAyE7B"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
// ─── ADR-111 Gate-1 miner slice 4: Stage-3 Compile + Stage-4 Verify ──────────
|
|
2
|
+
//
|
|
3
|
+
// The fresh, non-frozen G-series compile actuator. For each compile-routed
|
|
4
|
+
// (structural) `CandidateRuleRecord` it parses the lesson-markdown `dslSource`
|
|
5
|
+
// into a `CompiledRule`, runs the shipped Stage-4 codebase verifier, maps the
|
|
6
|
+
// outcome onto the rule's status/confidence/severity, and records the outcome on
|
|
7
|
+
// the classifier ledger (flips `stage4Confirmed` + sets `stage4Outcome`).
|
|
8
|
+
//
|
|
9
|
+
// FREEZE BOUNDARY (flag-3, BINDING): the frozen thing is the legacy `LessonInput`
|
|
10
|
+
// ACTUATOR (`compileLesson`/`buildCompiledRule`/`buildManualRule`, the
|
|
11
|
+
// `totem lesson compile` path), NOT the lesson-markdown format, its parser, or the
|
|
12
|
+
// pure validators. This module REUSES `extractManualPattern`/`engineFields`/
|
|
13
|
+
// `hashLesson`/`validateRegex`/`validateAstGrepPattern`/`verifyAgainstCodebase`
|
|
14
|
+
// (data-format + pure-validator + verifier reuse — Tenet 21) and NEVER imports or
|
|
15
|
+
// calls the frozen actuator. The compiled rule is minted `unverified: true` with
|
|
16
|
+
// `legitimacy`/`ruleClass` ABSENT (the wind-tunnel stamps them in slice 5) and is
|
|
17
|
+
// never persisted to a loadable manifest here (slice-5 stamp-before-persist).
|
|
18
|
+
// `validateAstGrepPattern` is a PURE validator (no IO/state) that happens to be
|
|
19
|
+
// defined in `compile-lesson.ts`. Importing it is validator reuse — OUTSIDE the
|
|
20
|
+
// freeze boundary, which is the `LessonInput` actuator path, not the validators
|
|
21
|
+
// (strategy-claude 2226Z, structural: the validator is already a shared leaf). We
|
|
22
|
+
// deliberately import ONLY this validator and NEVER the frozen actuator functions.
|
|
23
|
+
import { validateAstGrepPattern } from '../compile-lesson.js';
|
|
24
|
+
import { engineFields, hashLesson, sanitizeFileGlobs, validateRegex } from '../compiler.js';
|
|
25
|
+
import { CompiledRuleSchema, } from '../compiler-schema.js';
|
|
26
|
+
import { extractManualPattern } from '../lesson-pattern.js';
|
|
27
|
+
import { getDefaultBaseline, verifyAgainstCodebase, } from '../stage4-verifier.js';
|
|
28
|
+
/** Stable, deterministic lesson heading for a candidate (unique via its `clr-…` ledger ref). */
|
|
29
|
+
function candidateHeading(candidate) {
|
|
30
|
+
return `Gate-1 rule candidate (${candidate.classifierLedgerRef})`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Compile a single compile-routed candidate's `dslSource` into a `CompiledRule`.
|
|
34
|
+
* PURE (no IO). Throws — fail loud, never a silent skip — on a behavioral candidate
|
|
35
|
+
* (FM(c) code backstop) or a structural candidate whose `dslSource` yields no usable
|
|
36
|
+
* pattern (a producer-contract violation: slice-2's `isUsableDsl` preflight should
|
|
37
|
+
* have prevented emission, so this surfaces a preflight↔parser desync). Returns a
|
|
38
|
+
* `rejected` outcome (NOT a throw) when the pattern parses but fails per-engine
|
|
39
|
+
* safety validation (e.g. ReDoS) — a counted, reported `compile-rejected` state.
|
|
40
|
+
*/
|
|
41
|
+
export function compileCandidate(candidate, opts) {
|
|
42
|
+
if (candidate.classifierDisposition === 'behavioral') {
|
|
43
|
+
throw new Error(`[Totem Error] compileCandidate: behavioral candidate '${candidate.classifierLedgerRef}' must never be compiled (FM(c))`);
|
|
44
|
+
}
|
|
45
|
+
// May throw TotemParseError (e.g. a yaml fence under a non-ast-grep engine) — that
|
|
46
|
+
// propagates loudly as a producer bug; it would also have been dropped at extract.
|
|
47
|
+
const mp = extractManualPattern(candidate.dslSource);
|
|
48
|
+
if (mp === null) {
|
|
49
|
+
throw new Error(`[Totem Error] compileCandidate: structural candidate '${candidate.classifierLedgerRef}' has no usable pattern — slice-2 preflight (isUsableDsl) should have dropped it (preflight↔parser desync)`);
|
|
50
|
+
}
|
|
51
|
+
const fileGlobs = sanitizeFileGlobs(mp.fileGlobs ?? []);
|
|
52
|
+
// Per-engine safety validation, fail loud → `compile-rejected` (strategy sharpening:
|
|
53
|
+
// call the validator and reject on `{valid:false}`, never a silent/skipped compile).
|
|
54
|
+
if (mp.engine === 'regex') {
|
|
55
|
+
const v = validateRegex(mp.pattern);
|
|
56
|
+
if (!v.valid)
|
|
57
|
+
return { kind: 'rejected', reason: v.reason ?? 'invalid regex pattern' };
|
|
58
|
+
}
|
|
59
|
+
else if (mp.engine === 'ast-grep') {
|
|
60
|
+
const v = validateAstGrepPattern(mp.astGrepYamlRule ?? mp.pattern, fileGlobs);
|
|
61
|
+
if (!v.valid)
|
|
62
|
+
return { kind: 'rejected', reason: v.reason ?? 'invalid ast-grep rule' };
|
|
63
|
+
}
|
|
64
|
+
// engine 'ast' (tree-sitter S-expression): no ReDoS-class validator applies — the
|
|
65
|
+
// query was already structurally parsed by `extractManualPattern`.
|
|
66
|
+
const heading = candidateHeading(candidate);
|
|
67
|
+
const ef = engineFields(mp.engine, mp.astGrepYamlRule ?? mp.pattern);
|
|
68
|
+
const rule = CompiledRuleSchema.parse({
|
|
69
|
+
lessonHash: hashLesson(heading, candidate.dslSource),
|
|
70
|
+
lessonHeading: heading,
|
|
71
|
+
message: mp.message ?? heading,
|
|
72
|
+
engine: mp.engine,
|
|
73
|
+
...ef,
|
|
74
|
+
...(fileGlobs.length > 0 ? { fileGlobs } : {}),
|
|
75
|
+
severity: mp.severity,
|
|
76
|
+
...(mp.badExample !== undefined ? { badExample: mp.badExample } : {}),
|
|
77
|
+
compiledAt: opts.now,
|
|
78
|
+
createdAt: opts.now,
|
|
79
|
+
// Yellow/sensor-only: legitimacy + ruleClass ABSENT (slice-5 wind-tunnel stamps
|
|
80
|
+
// them); never `manual` (the markdown is the DSL carrier, NOT a Pipeline-1 trust
|
|
81
|
+
// claim — codex). `deriveRuleClass` forces 'advisory' on `unverified:true`.
|
|
82
|
+
unverified: true,
|
|
83
|
+
});
|
|
84
|
+
return { kind: 'compiled', rule };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Map a Stage-4 verifier outcome onto the rule's status/confidence/severity + the
|
|
88
|
+
* classifier-ledger fields (mirrors the frozen `applyStage4` semantics, but injects
|
|
89
|
+
* `now` instead of `new Date()` and sets `status` EXPLICITLY rather than relying on
|
|
90
|
+
* "missing status ⇒ active"). `stage4Confirmed` = "Stage-4 produced positive in-scope
|
|
91
|
+
* evidence sufficient for an active rule" → only the two active outcomes are confirmed.
|
|
92
|
+
*/
|
|
93
|
+
function mapStage4Outcome(outcome, now) {
|
|
94
|
+
switch (outcome) {
|
|
95
|
+
case 'in-scope-bad-example':
|
|
96
|
+
return {
|
|
97
|
+
rulePatch: { status: 'active', confidence: 'high' },
|
|
98
|
+
stage4Confirmed: true,
|
|
99
|
+
stage4Outcome: 'confirmed',
|
|
100
|
+
};
|
|
101
|
+
case 'candidate-debt':
|
|
102
|
+
// Real code differs from the authored badExample — force severity to the warning
|
|
103
|
+
// floor (never elevate), keep active (mirrors applyStage4).
|
|
104
|
+
return {
|
|
105
|
+
rulePatch: { status: 'active', severity: 'warning' },
|
|
106
|
+
stage4Confirmed: true,
|
|
107
|
+
stage4Outcome: 'confirmed',
|
|
108
|
+
};
|
|
109
|
+
case 'no-matches':
|
|
110
|
+
return {
|
|
111
|
+
rulePatch: { status: 'untested-against-codebase' },
|
|
112
|
+
stage4Confirmed: false,
|
|
113
|
+
stage4Outcome: 'untested-no-matches',
|
|
114
|
+
};
|
|
115
|
+
case 'out-of-scope':
|
|
116
|
+
// The §4 deterministic backstop ACTIVELY rejected a mis-structural candidate
|
|
117
|
+
// (fired on the verification baseline ⇒ over-broad). Archival is the SAFE
|
|
118
|
+
// direction (demote, never promote) and is the producer's call (slice 4), a
|
|
119
|
+
// distinct axis from the wind-tunnel's legitimacy gate (slice 5).
|
|
120
|
+
return {
|
|
121
|
+
rulePatch: {
|
|
122
|
+
status: 'archived',
|
|
123
|
+
archivedAt: now,
|
|
124
|
+
archivedReason: 'Stage 4 (mmnto-ai/totem#1682): pattern fired on the verification baseline (test/fixture scope) — over-broad. reasonCode: stage4-out-of-scope-match.',
|
|
125
|
+
},
|
|
126
|
+
stage4Confirmed: false,
|
|
127
|
+
stage4Outcome: 'archived-out-of-scope',
|
|
128
|
+
};
|
|
129
|
+
default: {
|
|
130
|
+
const _exhaustive = outcome;
|
|
131
|
+
throw new Error(`[Totem Error] mapStage4Outcome: unknown Stage-4 outcome '${String(_exhaustive)}'`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Run the Stage-3 Compile + Stage-4 Verify stage over a classify result. Selects
|
|
137
|
+
* ONLY compile-routed (structural) candidates and compiles them SEQUENTIALLY in
|
|
138
|
+
* stable classify-output order (deterministic ordinals before any async reorder).
|
|
139
|
+
* Returns the `CompiledCandidate[]` + the classifier ledger with `stage4Confirmed`
|
|
140
|
+
* and `stage4Outcome` filled on every compile-routed entry (behavioral/rag-only
|
|
141
|
+
* entries are left untouched). Mutates nothing: returns a new ledger object with a
|
|
142
|
+
* new entries array — updated entries are spread copies, unmodified entries share
|
|
143
|
+
* the original reference (a structural copy, not a deep copy).
|
|
144
|
+
*/
|
|
145
|
+
export async function runCompileStage(classify, deps) {
|
|
146
|
+
const baseline = deps.baseline ?? getDefaultBaseline();
|
|
147
|
+
// Determinism (codex fold) + perf (GCA): resolve the file list ONCE, sorted, and
|
|
148
|
+
// reuse that snapshot for every candidate. `verifyAgainstCodebase` calls
|
|
149
|
+
// `listFiles()` on each invocation, so an un-memoized wrapper would re-walk the
|
|
150
|
+
// repo once per structural candidate (N walks); the frozen snapshot also keeps the
|
|
151
|
+
// file order identical across candidates. Lazy — a zero-candidate run never walks.
|
|
152
|
+
let fileSnapshot;
|
|
153
|
+
const stage4 = {
|
|
154
|
+
...deps.stage4,
|
|
155
|
+
listFiles: async () => (fileSnapshot ??= [...(await deps.stage4.listFiles())].sort()),
|
|
156
|
+
};
|
|
157
|
+
const compiled = [];
|
|
158
|
+
const updates = new Map();
|
|
159
|
+
const structural = classify.candidates.filter((c) => c.classifierDisposition === 'structural');
|
|
160
|
+
for (const candidate of structural) {
|
|
161
|
+
// Classifier-ledger join: require EXACTLY ONE entry (missing or duplicate fails
|
|
162
|
+
// loud — else the Stage-4 confirmation is lost or applied to the wrong row).
|
|
163
|
+
const matches = classify.classifierLedger.entries.filter((e) => e.candidateRef === candidate.classifierLedgerRef);
|
|
164
|
+
if (matches.length !== 1) {
|
|
165
|
+
throw new Error(`[Totem Error] runCompileStage: classifierLedgerRef '${candidate.classifierLedgerRef}' matches ${matches.length} classifier-ledger entries (expected exactly 1)`);
|
|
166
|
+
}
|
|
167
|
+
const outcome = compileCandidate(candidate, { now: deps.now });
|
|
168
|
+
if (outcome.kind === 'rejected') {
|
|
169
|
+
updates.set(candidate.classifierLedgerRef, {
|
|
170
|
+
stage4Confirmed: false,
|
|
171
|
+
stage4Outcome: 'compile-rejected',
|
|
172
|
+
});
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
// ast / ast-grep rules need a working directory — fail loud, never degrade to
|
|
176
|
+
// `no-matches` (agy fold). Regex verification does not need it.
|
|
177
|
+
if (outcome.rule.engine !== 'regex' && deps.stage4.workingDirectory === undefined) {
|
|
178
|
+
throw new Error(`[Totem Error] runCompileStage: ${outcome.rule.engine} rule for '${candidate.classifierLedgerRef}' requires deps.stage4.workingDirectory`);
|
|
179
|
+
}
|
|
180
|
+
// A `readFile` failure inside the verifier propagates loudly (fail-loud Tenet 4) —
|
|
181
|
+
// no swallowing catch here.
|
|
182
|
+
const stage4Result = await verifyAgainstCodebase(outcome.rule, baseline, stage4);
|
|
183
|
+
const mapping = mapStage4Outcome(stage4Result.outcome, deps.now);
|
|
184
|
+
const rule = CompiledRuleSchema.parse({ ...outcome.rule, ...mapping.rulePatch });
|
|
185
|
+
compiled.push({
|
|
186
|
+
provenance: candidate.provenance,
|
|
187
|
+
classifierLedgerRef: candidate.classifierLedgerRef,
|
|
188
|
+
rule,
|
|
189
|
+
stage4: stage4Result,
|
|
190
|
+
});
|
|
191
|
+
updates.set(candidate.classifierLedgerRef, {
|
|
192
|
+
stage4Confirmed: mapping.stage4Confirmed,
|
|
193
|
+
stage4Outcome: mapping.stage4Outcome,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
const classifierLedger = {
|
|
197
|
+
entries: classify.classifierLedger.entries.map((e) => {
|
|
198
|
+
const u = updates.get(e.candidateRef);
|
|
199
|
+
return u ? { ...e, stage4Confirmed: u.stage4Confirmed, stage4Outcome: u.stage4Outcome } : e;
|
|
200
|
+
}),
|
|
201
|
+
};
|
|
202
|
+
return { compiled, classifierLedger };
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/spine/compile.ts"],"names":[],"mappings":"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"}
|