@mmnto/totem 1.67.1 → 1.68.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.
Files changed (90) hide show
  1. package/dist/capability/falsification.d.ts +18 -0
  2. package/dist/capability/falsification.d.ts.map +1 -0
  3. package/dist/capability/falsification.js +56 -0
  4. package/dist/capability/falsification.js.map +1 -0
  5. package/dist/capability/falsification.test.d.ts +2 -0
  6. package/dist/capability/falsification.test.d.ts.map +1 -0
  7. package/dist/capability/falsification.test.js +112 -0
  8. package/dist/capability/falsification.test.js.map +1 -0
  9. package/dist/capability/regenerate.d.ts +20 -0
  10. package/dist/capability/regenerate.d.ts.map +1 -0
  11. package/dist/capability/regenerate.js +0 -0
  12. package/dist/capability/regenerate.js.map +1 -0
  13. package/dist/capability/regenerate.test.d.ts +2 -0
  14. package/dist/capability/regenerate.test.d.ts.map +1 -0
  15. package/dist/capability/regenerate.test.js +136 -0
  16. package/dist/capability/regenerate.test.js.map +1 -0
  17. package/dist/capability/review-catch.d.ts +53 -0
  18. package/dist/capability/review-catch.d.ts.map +1 -0
  19. package/dist/capability/review-catch.js +92 -0
  20. package/dist/capability/review-catch.js.map +1 -0
  21. package/dist/capability/review-catch.test.d.ts +2 -0
  22. package/dist/capability/review-catch.test.d.ts.map +1 -0
  23. package/dist/capability/review-catch.test.js +90 -0
  24. package/dist/capability/review-catch.test.js.map +1 -0
  25. package/dist/capability/schema.d.ts +244 -0
  26. package/dist/capability/schema.d.ts.map +1 -0
  27. package/dist/capability/schema.js +141 -0
  28. package/dist/capability/schema.js.map +1 -0
  29. package/dist/capability/schema.test.d.ts +2 -0
  30. package/dist/capability/schema.test.d.ts.map +1 -0
  31. package/dist/capability/schema.test.js +93 -0
  32. package/dist/capability/schema.test.js.map +1 -0
  33. package/dist/index.d.ts +20 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +10 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/spine/candidate-rule.d.ts +84 -0
  38. package/dist/spine/candidate-rule.d.ts.map +1 -0
  39. package/dist/spine/candidate-rule.js +68 -0
  40. package/dist/spine/candidate-rule.js.map +1 -0
  41. package/dist/spine/candidate-rule.test.d.ts +2 -0
  42. package/dist/spine/candidate-rule.test.d.ts.map +1 -0
  43. package/dist/spine/candidate-rule.test.js +40 -0
  44. package/dist/spine/candidate-rule.test.js.map +1 -0
  45. package/dist/spine/classify.d.ts +93 -0
  46. package/dist/spine/classify.d.ts.map +1 -0
  47. package/dist/spine/classify.js +190 -0
  48. package/dist/spine/classify.js.map +1 -0
  49. package/dist/spine/classify.test.d.ts +2 -0
  50. package/dist/spine/classify.test.d.ts.map +1 -0
  51. package/dist/spine/classify.test.js +302 -0
  52. package/dist/spine/classify.test.js.map +1 -0
  53. package/dist/spine/compile.d.ts +62 -0
  54. package/dist/spine/compile.d.ts.map +1 -0
  55. package/dist/spine/compile.js +204 -0
  56. package/dist/spine/compile.js.map +1 -0
  57. package/dist/spine/compile.test.d.ts +2 -0
  58. package/dist/spine/compile.test.d.ts.map +1 -0
  59. package/dist/spine/compile.test.js +327 -0
  60. package/dist/spine/compile.test.js.map +1 -0
  61. package/dist/spine/extract.d.ts +146 -0
  62. package/dist/spine/extract.d.ts.map +1 -0
  63. package/dist/spine/extract.js +227 -0
  64. package/dist/spine/extract.js.map +1 -0
  65. package/dist/spine/extract.test.d.ts +2 -0
  66. package/dist/spine/extract.test.d.ts.map +1 -0
  67. package/dist/spine/extract.test.js +382 -0
  68. package/dist/spine/extract.test.js.map +1 -0
  69. package/dist/spine/ledgers.d.ts +1102 -0
  70. package/dist/spine/ledgers.d.ts.map +1 -0
  71. package/dist/spine/ledgers.js +209 -0
  72. package/dist/spine/ledgers.js.map +1 -0
  73. package/dist/spine/miner-harness.d.ts +30 -0
  74. package/dist/spine/miner-harness.d.ts.map +1 -0
  75. package/dist/spine/miner-harness.js +214 -0
  76. package/dist/spine/miner-harness.js.map +1 -0
  77. package/dist/spine/miner-harness.test.d.ts +2 -0
  78. package/dist/spine/miner-harness.test.d.ts.map +1 -0
  79. package/dist/spine/miner-harness.test.js +231 -0
  80. package/dist/spine/miner-harness.test.js.map +1 -0
  81. package/dist/spine/split.d.ts +149 -0
  82. package/dist/spine/split.d.ts.map +1 -0
  83. package/dist/spine/split.js +235 -0
  84. package/dist/spine/split.js.map +1 -0
  85. package/dist/spine/split.test.d.ts +2 -0
  86. package/dist/spine/split.test.d.ts.map +1 -0
  87. package/dist/spine/split.test.js +142 -0
  88. package/dist/spine/split.test.js.map +1 -0
  89. package/dist/spine/windtunnel-lock.d.ts +8 -8
  90. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/spine/classify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=classify.test.d.ts.map
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compile.test.d.ts.map