@mmnto/cli 1.88.0 → 1.89.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 (89) hide show
  1. package/dist/author-sandbox.d.ts +32 -0
  2. package/dist/author-sandbox.d.ts.map +1 -0
  3. package/dist/author-sandbox.js +95 -0
  4. package/dist/author-sandbox.js.map +1 -0
  5. package/dist/authored-rule-intake-prewindow.test.d.ts +2 -0
  6. package/dist/authored-rule-intake-prewindow.test.d.ts.map +1 -0
  7. package/dist/authored-rule-intake-prewindow.test.js +84 -0
  8. package/dist/authored-rule-intake-prewindow.test.js.map +1 -0
  9. package/dist/authored-rule-intake.d.ts +21 -1
  10. package/dist/authored-rule-intake.d.ts.map +1 -1
  11. package/dist/authored-rule-intake.js +56 -1
  12. package/dist/authored-rule-intake.js.map +1 -1
  13. package/dist/commands/authored-whitelist.d.ts.map +1 -1
  14. package/dist/commands/authored-whitelist.js +19 -8
  15. package/dist/commands/authored-whitelist.js.map +1 -1
  16. package/dist/commands/eject.d.ts.map +1 -1
  17. package/dist/commands/eject.js +10 -6
  18. package/dist/commands/eject.js.map +1 -1
  19. package/dist/commands/eject.test.js +5 -1
  20. package/dist/commands/eject.test.js.map +1 -1
  21. package/dist/commands/init-templates.d.ts +4 -0
  22. package/dist/commands/init-templates.d.ts.map +1 -1
  23. package/dist/commands/init-templates.js +25 -1
  24. package/dist/commands/init-templates.js.map +1 -1
  25. package/dist/commands/init.test.js +8 -3
  26. package/dist/commands/init.test.js.map +1 -1
  27. package/dist/commands/rule-author-command.test.js +29 -2
  28. package/dist/commands/rule-author-command.test.js.map +1 -1
  29. package/dist/commands/rule-author-teardown.test.d.ts +2 -0
  30. package/dist/commands/rule-author-teardown.test.d.ts.map +1 -0
  31. package/dist/commands/rule-author-teardown.test.js +123 -0
  32. package/dist/commands/rule-author-teardown.test.js.map +1 -0
  33. package/dist/commands/rule-author.d.ts +1 -0
  34. package/dist/commands/rule-author.d.ts.map +1 -1
  35. package/dist/commands/rule-author.js +143 -2
  36. package/dist/commands/rule-author.js.map +1 -1
  37. package/dist/commands/spine-authored-cert-corpus.d.ts +15 -0
  38. package/dist/commands/spine-authored-cert-corpus.d.ts.map +1 -1
  39. package/dist/commands/spine-authored-cert-corpus.js +17 -1
  40. package/dist/commands/spine-authored-cert-corpus.js.map +1 -1
  41. package/dist/commands/spine-authored-cert-corpus.test.js +440 -4
  42. package/dist/commands/spine-authored-cert-corpus.test.js.map +1 -1
  43. package/dist/commands/spine-authored-materialize.d.ts +55 -0
  44. package/dist/commands/spine-authored-materialize.d.ts.map +1 -0
  45. package/dist/commands/spine-authored-materialize.js +315 -0
  46. package/dist/commands/spine-authored-materialize.js.map +1 -0
  47. package/dist/commands/spine-cert-materialize.d.ts.map +1 -1
  48. package/dist/commands/spine-cert-materialize.js +17 -0
  49. package/dist/commands/spine-cert-materialize.js.map +1 -1
  50. package/dist/commands/spine-cert-persist.d.ts +17 -1
  51. package/dist/commands/spine-cert-persist.d.ts.map +1 -1
  52. package/dist/commands/spine-cert-persist.js +17 -5
  53. package/dist/commands/spine-cert-persist.js.map +1 -1
  54. package/dist/commands/spine-cert-persist.test.js +60 -0
  55. package/dist/commands/spine-cert-persist.test.js.map +1 -1
  56. package/dist/commands/spine-cert-run-corpus.d.ts +18 -28
  57. package/dist/commands/spine-cert-run-corpus.d.ts.map +1 -1
  58. package/dist/commands/spine-cert-run-corpus.js +162 -21
  59. package/dist/commands/spine-cert-run-corpus.js.map +1 -1
  60. package/dist/commands/spine-derive-labels.d.ts.map +1 -1
  61. package/dist/commands/spine-derive-labels.js +9 -1
  62. package/dist/commands/spine-derive-labels.js.map +1 -1
  63. package/dist/commands/spine-freeze-orchestration.test.d.ts +2 -0
  64. package/dist/commands/spine-freeze-orchestration.test.d.ts.map +1 -0
  65. package/dist/commands/spine-freeze-orchestration.test.js +468 -0
  66. package/dist/commands/spine-freeze-orchestration.test.js.map +1 -0
  67. package/dist/commands/spine-freeze-split.d.ts +10 -0
  68. package/dist/commands/spine-freeze-split.d.ts.map +1 -0
  69. package/dist/commands/spine-freeze-split.js +131 -0
  70. package/dist/commands/spine-freeze-split.js.map +1 -0
  71. package/dist/commands/spine-windtunnel.d.ts +35 -0
  72. package/dist/commands/spine-windtunnel.d.ts.map +1 -1
  73. package/dist/commands/spine-windtunnel.js +47 -7
  74. package/dist/commands/spine-windtunnel.js.map +1 -1
  75. package/dist/index.js +21 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/spine-fixture-ancestry.d.ts +20 -0
  78. package/dist/spine-fixture-ancestry.d.ts.map +1 -0
  79. package/dist/spine-fixture-ancestry.js +46 -0
  80. package/dist/spine-fixture-ancestry.js.map +1 -0
  81. package/dist/spine-fixture-ancestry.test.d.ts +2 -0
  82. package/dist/spine-fixture-ancestry.test.d.ts.map +1 -0
  83. package/dist/spine-fixture-ancestry.test.js +62 -0
  84. package/dist/spine-fixture-ancestry.test.js.map +1 -0
  85. package/dist/spine-freeze-proof.d.ts +89 -0
  86. package/dist/spine-freeze-proof.d.ts.map +1 -0
  87. package/dist/spine-freeze-proof.js +237 -0
  88. package/dist/spine-freeze-proof.js.map +1 -0
  89. package/package.json +2 -2
@@ -0,0 +1,468 @@
1
+ // ─── ADR-112 §5.1/§5.4/§8 R1 — freeze-orchestration end-to-end (real git) ─────
2
+ //
3
+ // The agy seams RULING: the proof gates are exercised against PROGRAMMATIC REAL
4
+ // GIT FIXTURES (git init/commit/push in temp dirs) — injected git mocks would
5
+ // only test the mocks. Each test builds its own world (an lc clone, a totem repo
6
+ // with a bare `origin`), so tamper rows mutate freely without cross-test bleed.
7
+ // LC ENUMERATION stays real too (the freeze command shells the real
8
+ // `enumeratePrMetas`); only nothing is mocked on the proof path.
9
+ import * as fs from 'node:fs';
10
+ import * as os from 'node:os';
11
+ import * as path from 'node:path';
12
+ import { afterEach, describe, expect, it } from 'vitest';
13
+ import { stringify as yamlStringify } from 'yaml';
14
+ import { assembleFrozenSplitArtifact, canonicalStringify, CertCorpusSeedSchema, FrozenSplitArtifactSchema, readAuthoringLedger, safeExec, } from '@mmnto/totem';
15
+ import { prepareAuthorSandbox, removeAuthorSandbox } from '../author-sandbox.js';
16
+ import { runRuleAuthor } from '../authored-rule-intake.js';
17
+ import { resolveFrozenSplitByRef, verifySharedFrozenSplit } from '../spine-freeze-proof.js';
18
+ import { materializeAuthored } from './spine-authored-materialize.js';
19
+ import { assembleAuthoredCertifyingCorpus } from './spine-cert-run-corpus.js';
20
+ import { freezeSplitCommand } from './spine-freeze-split.js';
21
+ const SHARED_REF = 'origin/main';
22
+ const JUDGED_BY = 'static-whitelist@cert-1';
23
+ const roots = [];
24
+ afterEach(() => {
25
+ for (const r of roots.splice(0))
26
+ fs.rmSync(r, { recursive: true, force: true });
27
+ });
28
+ function git(args, cwd) {
29
+ return safeExec('git', args, { cwd });
30
+ }
31
+ function initRepo(dir) {
32
+ fs.mkdirSync(dir, { recursive: true });
33
+ git(['init', '-b', 'main'], dir);
34
+ git(['config', 'user.email', 'dev@example.com'], dir);
35
+ git(['config', 'user.name', 'Dev'], dir);
36
+ git(['config', 'core.autocrlf', 'false'], dir);
37
+ git(['config', 'commit.gpgsign', 'false'], dir);
38
+ }
39
+ function commitAll(dir, message) {
40
+ git(['add', '-A'], dir);
41
+ git(['commit', '-m', message], dir);
42
+ return git(['rev-parse', 'HEAD'], dir).trim();
43
+ }
44
+ /** Wire a bare `origin` and push main, so `origin/main` topology is REAL. */
45
+ function wireOrigin(dir, bareDir) {
46
+ git(['init', '--bare', bareDir], path.dirname(bareDir));
47
+ git(['remote', 'add', 'origin', bareDir], dir);
48
+ pushMain(dir);
49
+ }
50
+ function pushMain(dir) {
51
+ git(['push', 'origin', 'main'], dir);
52
+ git(['fetch', 'origin'], dir); // pin the remote-tracking ref regardless of git version
53
+ }
54
+ /** An lc fixture: an init commit (no PR) + PRs #1..#4, each adding one code file. */
55
+ function buildLc(dir) {
56
+ initRepo(dir);
57
+ fs.writeFileSync(path.join(dir, 'README.md'), 'lc fixture\n', 'utf-8');
58
+ commitAll(dir, 'chore: init');
59
+ for (const pr of [1, 2, 3, 4]) {
60
+ fs.writeFileSync(path.join(dir, `src-f${pr}.rs`), `fn f${pr}() {}\n`, 'utf-8');
61
+ commitAll(dir, `feat: guard ${pr} (#${pr})`);
62
+ }
63
+ }
64
+ const FREEZE_PARAMS = {
65
+ gate: 'gate-1',
66
+ repo: 'fixture/lc',
67
+ selectionRule: {
68
+ predicate: 'code-touching non-bot',
69
+ window: { type: 'all' },
70
+ codePathClassifier: { includeGlobs: ['src-*.rs'], excludeGlobs: ['**/*.md'] },
71
+ excludeRevertPairs: true,
72
+ excludeBotPrs: true,
73
+ },
74
+ split: { cutIndex: 2, excludedPrs: [] },
75
+ };
76
+ /** Freeze against the lc fixture; artifact written but NOT yet committed/shared. */
77
+ async function buildFrozenWorld() {
78
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'r1-freeze-'));
79
+ roots.push(root);
80
+ const lcDir = path.join(root, 'lc');
81
+ buildLc(lcDir);
82
+ const repoRoot = path.join(root, 'totem');
83
+ initRepo(repoRoot);
84
+ fs.writeFileSync(path.join(repoRoot, 'README.md'), 'totem fixture\n', 'utf-8');
85
+ commitAll(repoRoot, 'chore: init');
86
+ wireOrigin(repoRoot, path.join(root, 'origin.git'));
87
+ const paramsPath = path.join(repoRoot, 'freeze-params.json');
88
+ fs.writeFileSync(paramsPath, JSON.stringify(FREEZE_PARAMS), 'utf-8');
89
+ await freezeSplitCommand({ paramsPath, lcDir, cwd: repoRoot });
90
+ const totemDir = path.join(repoRoot, '.totem');
91
+ const artifactPath = path.join(totemDir, 'spine', 'gate-1', 'frozen-split.json');
92
+ const artifact = FrozenSplitArtifactSchema.parse(JSON.parse(fs.readFileSync(artifactPath, 'utf-8')));
93
+ return { lcDir, repoRoot, totemDir, artifactPath, artifact };
94
+ }
95
+ /** Freeze + share (commit + push) — the operator-named freeze PR landing, condensed. */
96
+ async function buildSharedWorld() {
97
+ const w = await buildFrozenWorld();
98
+ commitAll(w.repoRoot, 'freeze: gate-1 frozen split');
99
+ pushMain(w.repoRoot);
100
+ return w;
101
+ }
102
+ /** A full-ISO authoredAt strictly after the world's freeze instant (real chronology). */
103
+ function authoredAtAfterFreeze(w) {
104
+ return new Date(Date.parse(w.artifact.split.frozenAt) + 60_000).toISOString();
105
+ }
106
+ function writeAuthoredYaml(w, over = {}) {
107
+ // `freezeCommitment: null` ⇒ OMIT the header field (the absence row); undefined ⇒ the real one.
108
+ const commitment = over.freezeCommitment === null
109
+ ? {}
110
+ : { freezeCommitment: over.freezeCommitment ?? w.artifact.freezeCommitment };
111
+ const doc = {
112
+ splitRef: over.splitRef ?? w.artifact.splitRef,
113
+ ...commitment,
114
+ authoredAfterSplit: true,
115
+ heldOutNonInspectionAttestation: true,
116
+ rules: [
117
+ {
118
+ author: 'alice',
119
+ authoredAt: authoredAtAfterFreeze(w),
120
+ targetDefect: 'forbidden console.log in prod',
121
+ declaredEngine: 'regex',
122
+ structuralClass: 'forbidden-literal-token',
123
+ dslSource: over.dslSource ?? 'console\\.log',
124
+ positiveFixtures: [
125
+ {
126
+ pr: over.fixturePr ?? 1,
127
+ preimageSource: {
128
+ kind: 'lesson',
129
+ lessonRef: 'a1b2c3d4e5f60718',
130
+ badExample: 'console.log("dbg")',
131
+ goodExample: 'logger.debug("dbg")',
132
+ },
133
+ filePath: 'src-f1.rs',
134
+ matchedSpan: 'L1-L2',
135
+ contentHash: 'h'.repeat(8),
136
+ },
137
+ ],
138
+ },
139
+ ],
140
+ };
141
+ fs.writeFileSync(path.join(w.totemDir, 'spine', 'authored-rules.yaml'), yamlStringify(doc), 'utf-8');
142
+ }
143
+ /** Resolve + prove + intake (what `totem rule author` does once the ref is content-addressed). */
144
+ function authorUnderFreeze(w) {
145
+ const resolved = resolveFrozenSplitByRef(w.totemDir, w.repoRoot, w.artifact.splitRef);
146
+ verifySharedFrozenSplit({ repoRoot: w.repoRoot, resolved, safeExec, sharedRef: SHARED_REF });
147
+ runRuleAuthor(w.totemDir, {
148
+ judgedBy: JUDGED_BY,
149
+ freezeBinding: { artifact: resolved.artifact },
150
+ });
151
+ }
152
+ function frozenSeed(w) {
153
+ return CertCorpusSeedSchema.parse({
154
+ producerKind: 'authored',
155
+ gate: 'gate-1',
156
+ canonicalPath: '.totem/spine/gate-1/windtunnel.lock.json',
157
+ repo: 'fixture/lc',
158
+ phase: 'certifying',
159
+ selectionRule: {
160
+ state: 'merged',
161
+ predicate: FREEZE_PARAMS.selectionRule.predicate,
162
+ window: { type: 'all' },
163
+ asOfCommit: w.artifact.split.asOfCommit,
164
+ codePathClassifier: FREEZE_PARAMS.selectionRule.codePathClassifier,
165
+ excludeRevertPairs: true,
166
+ excludeBotPrs: true,
167
+ },
168
+ split: { cutIndex: 2, excludedPrs: [], frozenSplitRef: w.artifact.splitRef },
169
+ controls: {
170
+ positiveRef: '.totem/spine/gate-1/controls/positive',
171
+ negativeRef: '.totem/spine/gate-1/controls/negative',
172
+ mechanism: 'git-hash-object',
173
+ positive: [],
174
+ negative: [],
175
+ },
176
+ fpDefinition: { rubricRef: 'r', groundTruthRef: 'g', adjudicator: 'disposition-derived' },
177
+ cullRateThreshold: 0.1,
178
+ exposureDenominator: {
179
+ activeRulesEvaluated: { floor: 2 },
180
+ filesTouchedInWindow: { floor: 0 },
181
+ positiveControlsExercised: { floor: 0 },
182
+ },
183
+ });
184
+ }
185
+ async function materialize(w) {
186
+ await materializeAuthored({
187
+ seed: frozenSeed(w),
188
+ lcDir: w.lcDir,
189
+ repoRoot: w.repoRoot,
190
+ cwd: w.repoRoot,
191
+ totemDir: w.totemDir,
192
+ resolveWithinRepo: (input) => path.resolve(w.repoRoot, input),
193
+ safeExec,
194
+ sharedRef: SHARED_REF,
195
+ });
196
+ }
197
+ describe('R1 freeze-orchestration (real-git end-to-end)', () => {
198
+ it('happy path: freeze → share → author under binding → materialize from the frozen artifact', async () => {
199
+ const w = await buildSharedWorld();
200
+ // The freeze derived asOfCommit from lc HEAD and pinned it (Q3 derived-at-freeze).
201
+ expect(w.artifact.split.asOfCommit).toBe(git(['rev-parse', 'HEAD'], w.lcDir).trim());
202
+ // Train = the 2 OLDEST PRs; the sandbox anchor is the newest TRAIN commit.
203
+ expect(w.artifact.split.trainPrs).toEqual([1, 2]);
204
+ expect(w.artifact.split.heldOutPrs).toEqual([3, 4]);
205
+ writeAuthoredYaml(w);
206
+ authorUnderFreeze(w);
207
+ const entries = readAuthoringLedger(w.totemDir);
208
+ expect(entries).toHaveLength(1);
209
+ expect(entries[0].freezeCommitment).toBe(w.artifact.freezeCommitment);
210
+ expect(entries[0].splitRef).toBe(w.artifact.splitRef);
211
+ commitAll(w.repoRoot, 'author: rule under gate-1 freeze');
212
+ pushMain(w.repoRoot);
213
+ await materialize(w);
214
+ const gate1 = path.join(w.totemDir, 'spine', 'gate-1');
215
+ const lock = JSON.parse(fs.readFileSync(path.join(gate1, 'windtunnel.lock.json'), 'utf-8'));
216
+ expect(lock.producerKind).toBe('authored');
217
+ expect(lock.authored).toEqual({ expectedSplitRef: w.artifact.splitRef });
218
+ // codex fold-5: split.json is the BYTE-IDENTICAL copy of the frozen artifact's split.
219
+ expect(fs.readFileSync(path.join(gate1, 'split.json'), 'utf-8')).toBe(`${canonicalStringify(w.artifact.split, 2)}\n`);
220
+ });
221
+ it('cert re-derive threads a PROVEN freeze binding for a content-addressed run (CR round 1)', async () => {
222
+ // The seam CR caught: the cert-run boundary re-invokes intake on authored-rules.yaml,
223
+ // so a content-addressed run must resolve + PROVE the binding there or the intake's
224
+ // total partition voids the verifyOnly re-derive with GATE_INVALID.
225
+ const w = await buildSharedWorld();
226
+ // A COMPILE-USABLE dsl (the D5 assembler fixture shape) — this row runs the full
227
+ // assembly, so the rule must survive runCompileStage, not just intake.
228
+ const compilableDsl = [
229
+ '**Pattern:** `console\\.log\\(`',
230
+ '**Engine:** regex',
231
+ '**Severity:** warning',
232
+ '',
233
+ '### Bad Example',
234
+ '```ts',
235
+ 'console.log("dbg")',
236
+ '```',
237
+ ].join('\n');
238
+ writeAuthoredYaml(w, { dslSource: compilableDsl });
239
+ authorUnderFreeze(w);
240
+ commitAll(w.repoRoot, 'author: rule under gate-1 freeze');
241
+ pushMain(w.repoRoot);
242
+ await materialize(w);
243
+ const gate1Dir = path.join(w.totemDir, 'spine', 'gate-1');
244
+ const lock = JSON.parse(fs.readFileSync(path.join(gate1Dir, 'windtunnel.lock.json'), 'utf-8'));
245
+ const stage4 = {
246
+ listFiles: () => Promise.resolve(['src-f1.rs']),
247
+ readFile: () => Promise.resolve('logger.debug("dbg")'),
248
+ };
249
+ // Without the proof deps a content-addressed run REFUSES (never skips the proof)…
250
+ await expect(assembleAuthoredCertifyingCorpus({ gate1Dir, totemDir: w.totemDir, stage4, now: authoredAtAfterFreeze(w) }, lock)).rejects.toThrow(/never skips resolve\+prove|repoRoot/);
251
+ // …and WITH them the binding resolves, proves, and threads: the verifyOnly
252
+ // re-derive passes the intake's content-ref gate and the corpus assembles.
253
+ const { corpus } = await assembleAuthoredCertifyingCorpus({
254
+ gate1Dir,
255
+ totemDir: w.totemDir,
256
+ stage4,
257
+ now: authoredAtAfterFreeze(w),
258
+ repoRoot: w.repoRoot,
259
+ safeExec,
260
+ }, lock);
261
+ expect(corpus.rules.length).toBeGreaterThan(0);
262
+ // The §6 controls channel is bound — the assembly ran end-to-end, which is only
263
+ // reachable when the proven binding satisfied the intake's content-ref gate.
264
+ expect(corpus.authoredControls).toBeDefined();
265
+ });
266
+ it('refuses to overwrite an existing freeze without --refreeze', async () => {
267
+ const w = await buildFrozenWorld();
268
+ const paramsPath = path.join(w.repoRoot, 'freeze-params.json');
269
+ await expect(freezeSplitCommand({ paramsPath, lcDir: w.lcDir, cwd: w.repoRoot })).rejects.toThrow(/re-freeze/i);
270
+ await freezeSplitCommand({ paramsPath, lcDir: w.lcDir, cwd: w.repoRoot, refreeze: true });
271
+ });
272
+ it('t1: a re-freeze orphans every downstream ledger entry (commitment mismatch at materialize)', async () => {
273
+ const w = await buildSharedWorld();
274
+ writeAuthoredYaml(w);
275
+ authorUnderFreeze(w);
276
+ commitAll(w.repoRoot, 'author: rule under gate-1 freeze');
277
+ pushMain(w.repoRoot);
278
+ // Re-freeze (new frozenAt ⇒ new commitment; new content ⇒ new splitRef), share it.
279
+ await freezeSplitCommand({
280
+ paramsPath: path.join(w.repoRoot, 'freeze-params.json'),
281
+ lcDir: w.lcDir,
282
+ cwd: w.repoRoot,
283
+ refreeze: true,
284
+ });
285
+ const refrozen = FrozenSplitArtifactSchema.parse(JSON.parse(fs.readFileSync(w.artifactPath, 'utf-8')));
286
+ expect(refrozen.freezeCommitment).not.toBe(w.artifact.freezeCommitment);
287
+ commitAll(w.repoRoot, 'freeze: gate-1 RE-frozen split');
288
+ pushMain(w.repoRoot);
289
+ const w2 = { ...w, artifact: refrozen };
290
+ await expect(materialize(w2)).rejects.toThrow(/entry-commitment-mismatch|ledger-ref-mismatch/);
291
+ });
292
+ it('t2/t8: a frozenAt postdating the introducing commit fails the temporal-consistency row', async () => {
293
+ const w = await buildFrozenWorld();
294
+ // Re-assemble with a future instant (integrity stays self-consistent — only
295
+ // the shared-history consistency check can catch a doctored stamp).
296
+ const doctored = assembleFrozenSplitArtifact({
297
+ gate: w.artifact.gate,
298
+ repo: w.artifact.repo,
299
+ selectionPins: w.artifact.selectionPins,
300
+ split: { ...w.artifact.split, frozenAt: new Date(Date.now() + 86_400_000).toISOString() },
301
+ cutBoundarySha: w.artifact.cutBoundarySha,
302
+ corpusIntegrity: w.artifact.corpusIntegrity,
303
+ });
304
+ fs.writeFileSync(w.artifactPath, `${canonicalStringify(doctored, 2)}\n`, 'utf-8');
305
+ commitAll(w.repoRoot, 'freeze: doctored future stamp');
306
+ pushMain(w.repoRoot);
307
+ const resolved = resolveFrozenSplitByRef(w.totemDir, w.repoRoot, doctored.splitRef);
308
+ expect(() => verifySharedFrozenSplit({ repoRoot: w.repoRoot, resolved, safeExec, sharedRef: SHARED_REF })).toThrow(/temporal-consistency/);
309
+ });
310
+ it('t3: a ledger entry landing in the SAME commit as the freeze fails ancestry ordering', async () => {
311
+ const w = await buildFrozenWorld();
312
+ writeAuthoredYaml(w);
313
+ // Bind against the not-yet-shared artifact by constructing the binding directly
314
+ // (the shared proof would rightly refuse; the row under test is the LEDGER one).
315
+ runRuleAuthor(w.totemDir, { judgedBy: JUDGED_BY, freezeBinding: { artifact: w.artifact } });
316
+ commitAll(w.repoRoot, 'freeze AND author in one commit (illegitimate)');
317
+ pushMain(w.repoRoot);
318
+ await expect(materialize(w)).rejects.toThrow(/entry-not-after-freeze/);
319
+ });
320
+ it('t4: authoring against an unresolvable frozen splitRef fails loud', async () => {
321
+ const w = await buildSharedWorld();
322
+ const ghostRef = `split:${'e'.repeat(64)}`;
323
+ expect(() => resolveFrozenSplitByRef(w.totemDir, w.repoRoot, ghostRef)).toThrow(/ref-unresolved/);
324
+ // And the git-free intake refuses a content-addressed ref with NO verified binding.
325
+ writeAuthoredYaml(w, { splitRef: ghostRef });
326
+ expect(() => runRuleAuthor(w.totemDir, { judgedBy: JUDGED_BY })).toThrow(/no verified frozen split/);
327
+ });
328
+ it('t5: an uncommitted artifact fails the commit-anchor (distinct from not-shared)', async () => {
329
+ const w = await buildFrozenWorld(); // written, never committed
330
+ const resolved = resolveFrozenSplitByRef(w.totemDir, w.repoRoot, w.artifact.splitRef);
331
+ expect(() => verifySharedFrozenSplit({ repoRoot: w.repoRoot, resolved, safeExec, sharedRef: SHARED_REF })).toThrow(/artifact-uncommitted/);
332
+ });
333
+ it('t5b: a committed-but-unpushed artifact fails as artifact-not-shared (the HEAD-proof gap)', async () => {
334
+ const w = await buildFrozenWorld();
335
+ commitAll(w.repoRoot, 'freeze: local only');
336
+ // NOT pushed — tracked, in local HEAD ancestry, absent from origin/main.
337
+ const resolved = resolveFrozenSplitByRef(w.totemDir, w.repoRoot, w.artifact.splitRef);
338
+ expect(() => verifySharedFrozenSplit({ repoRoot: w.repoRoot, resolved, safeExec, sharedRef: SHARED_REF })).toThrow(/artifact-not-shared/);
339
+ });
340
+ it('t7a: an in-place field edit fails the pure integrity check (artifact-integrity)', async () => {
341
+ const w = await buildSharedWorld();
342
+ const tampered = { ...w.artifact, cutBoundarySha: 'f'.repeat(40) };
343
+ fs.writeFileSync(w.artifactPath, `${canonicalStringify(tampered, 2)}\n`, 'utf-8');
344
+ expect(() => resolveFrozenSplitByRef(w.totemDir, w.repoRoot, w.artifact.splitRef)).toThrow(/artifact-integrity/);
345
+ });
346
+ it('t7b: a self-consistent REPLACEMENT of a shared artifact fails blob equality', async () => {
347
+ const w = await buildSharedWorld();
348
+ // Fully re-assembled (integrity-valid) artifact with different membership,
349
+ // overwriting the shared file in the working tree WITHOUT a new commit.
350
+ const replaced = assembleFrozenSplitArtifact({
351
+ gate: w.artifact.gate,
352
+ repo: w.artifact.repo,
353
+ selectionPins: w.artifact.selectionPins,
354
+ split: {
355
+ ...w.artifact.split,
356
+ trainPrs: [1, 2, 3],
357
+ heldOutPrs: [4],
358
+ splitRule: { ...w.artifact.split.splitRule, cutIndex: 3 },
359
+ },
360
+ cutBoundarySha: w.artifact.cutBoundarySha,
361
+ corpusIntegrity: w.artifact.corpusIntegrity,
362
+ });
363
+ fs.writeFileSync(w.artifactPath, `${canonicalStringify(replaced, 2)}\n`, 'utf-8');
364
+ const resolved = resolveFrozenSplitByRef(w.totemDir, w.repoRoot, replaced.splitRef);
365
+ expect(() => verifySharedFrozenSplit({ repoRoot: w.repoRoot, resolved, safeExec, sharedRef: SHARED_REF })).toThrow(/artifact-uncommitted|artifact-blob-differs|artifact-not-shared/);
366
+ });
367
+ it('t6: the author sandbox denies reads outside the derived train-tree root', async () => {
368
+ const w = await buildSharedWorld();
369
+ const sandbox = prepareAuthorSandbox({
370
+ lcDir: w.lcDir,
371
+ totemDir: w.totemDir,
372
+ artifact: w.artifact,
373
+ safeExec,
374
+ });
375
+ try {
376
+ // The root is workspace-derived (`<totemDir>/temp/`), never os.tmpdir().
377
+ expect(path.relative(w.totemDir, sandbox.root).startsWith('..')).toBe(false);
378
+ // The boundary tree is lc AT THE CUT: train PRs (#1, #2) are present…
379
+ expect(sandbox.readFile('src-f2.rs')).toContain('fn f2');
380
+ // …and the held-out era simply does not exist in this tree.
381
+ expect(fs.existsSync(path.join(sandbox.root, 'src-f3.rs'))).toBe(false);
382
+ // Escapes fail loud (t6), absolute or relative.
383
+ expect(() => sandbox.readFile('../outside.txt')).toThrow(/§5.4|escape/);
384
+ expect(() => sandbox.readFile(path.join(w.repoRoot, 'README.md'))).toThrow(/§5.4|escape/);
385
+ // Symlink escape: a link INSIDE the root pointing outside must be caught by
386
+ // the realpath containment check, not followed (greptile/CR round 1).
387
+ const outside = path.join(w.repoRoot, 'held-out-secret.txt');
388
+ fs.writeFileSync(outside, 'embargoed', 'utf-8');
389
+ const linkPath = path.join(sandbox.root, 'sneaky-link.txt');
390
+ let linkable = true;
391
+ try {
392
+ fs.symlinkSync(outside, linkPath);
393
+ }
394
+ catch {
395
+ // Windows without Developer Mode cannot create symlinks — the guard is
396
+ // still exercised on POSIX CI; skip only the symlink leg here.
397
+ linkable = false;
398
+ }
399
+ if (linkable) {
400
+ expect(() => sandbox.readFile('sneaky-link.txt')).toThrow(/§5.4|escape/);
401
+ }
402
+ }
403
+ finally {
404
+ removeAuthorSandbox({ lcDir: w.lcDir, root: sandbox.root, safeExec });
405
+ }
406
+ expect(fs.existsSync(sandbox.root)).toBe(false);
407
+ });
408
+ it('intake partition: header commitment absent / mismatched / on a free-text ref', async () => {
409
+ const w = await buildSharedWorld();
410
+ const resolved = resolveFrozenSplitByRef(w.totemDir, w.repoRoot, w.artifact.splitRef);
411
+ const binding = { artifact: resolved.artifact };
412
+ writeAuthoredYaml(w, { freezeCommitment: null });
413
+ expect(() => runRuleAuthor(w.totemDir, { judgedBy: JUDGED_BY, freezeBinding: binding })).toThrow(/omits freezeCommitment/);
414
+ writeAuthoredYaml(w, { freezeCommitment: 'c'.repeat(64) });
415
+ expect(() => runRuleAuthor(w.totemDir, { judgedBy: JUDGED_BY, freezeBinding: binding })).toThrow(/re-frozen after this header/);
416
+ // A commitment riding a LEGACY free-text splitRef is an unanchored claim — refused.
417
+ writeAuthoredYaml(w, { splitRef: 'split-2026-06-27' });
418
+ expect(() => runRuleAuthor(w.totemDir, { judgedBy: JUDGED_BY })).toThrow(/free-text splitRef/);
419
+ });
420
+ it('intake: a HELD-OUT positive fixture fails at author time (§5.2 leakage semantics, FM (c))', async () => {
421
+ const w = await buildSharedWorld();
422
+ const resolved = resolveFrozenSplitByRef(w.totemDir, w.repoRoot, w.artifact.splitRef);
423
+ writeAuthoredYaml(w, { fixturePr: 3 }); // #3 is held-out
424
+ expect(() => runRuleAuthor(w.totemDir, {
425
+ judgedBy: JUDGED_BY,
426
+ freezeBinding: { artifact: resolved.artifact },
427
+ })).toThrow(/HELD-OUT slice/);
428
+ });
429
+ it('intake: an out-of-window fixture is unproven WITHOUT the ancestry set and accepted WITH it (§5.2 option (a))', async () => {
430
+ const w = await buildSharedWorld();
431
+ const resolved = resolveFrozenSplitByRef(w.totemDir, w.repoRoot, w.artifact.splitRef);
432
+ writeAuthoredYaml(w, { fixturePr: 999 }); // outside train ∪ heldOut
433
+ expect(() => runRuleAuthor(w.totemDir, {
434
+ judgedBy: JUDGED_BY,
435
+ freezeBinding: { artifact: resolved.artifact },
436
+ })).toThrow(/NOT proven strictly pre-window/);
437
+ const result = runRuleAuthor(w.totemDir, {
438
+ judgedBy: JUDGED_BY,
439
+ freezeBinding: { artifact: resolved.artifact },
440
+ verifiedPreWindowFixturePrs: new Set([999]),
441
+ });
442
+ expect(result.records).toHaveLength(1);
443
+ });
444
+ it('#2289 must-not-widen: no R1-participating module consults the doctrine pin', () => {
445
+ // EVERY module in the freeze-binding flow, cli AND core (CR #2293 round 1:
446
+ // a pin reference in an unscanned participant would pass silently).
447
+ const coreSpine = path.join(__dirname, '..', '..', '..', 'core', 'src', 'spine');
448
+ const sources = [
449
+ path.join(__dirname, 'spine-freeze-split.ts'),
450
+ path.join(__dirname, '..', 'spine-freeze-proof.ts'),
451
+ path.join(__dirname, '..', 'author-sandbox.ts'),
452
+ path.join(__dirname, 'spine-authored-materialize.ts'),
453
+ path.join(__dirname, '..', 'authored-rule-intake.ts'),
454
+ path.join(__dirname, 'rule-author.ts'),
455
+ path.join(__dirname, 'spine-authored-cert-corpus.ts'),
456
+ path.join(__dirname, 'spine-cert-run-corpus.ts'),
457
+ path.join(coreSpine, 'frozen-split.ts'),
458
+ path.join(coreSpine, 'authored-rule.ts'),
459
+ path.join(coreSpine, 'authoring-ledger.ts'),
460
+ path.join(coreSpine, 'cert-corpus-seed.ts'),
461
+ ];
462
+ for (const src of sources) {
463
+ expect(fs.existsSync(src), `scan-list path missing: ${src}`).toBe(true);
464
+ expect(fs.readFileSync(src, 'utf-8')).not.toMatch(/strategy-doctrine/);
465
+ }
466
+ });
467
+ });
468
+ //# sourceMappingURL=spine-freeze-orchestration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spine-freeze-orchestration.test.js","sourceRoot":"","sources":["../../src/commands/spine-freeze-orchestration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface FreezeSplitOptions {
2
+ paramsPath: string;
3
+ lcDir?: string;
4
+ /** Explicitly authorize overwriting an existing artifact (a re-freeze is a NEW freeze via a new PR). */
5
+ refreeze?: boolean;
6
+ /** Working dir the repo root resolves from (default `process.cwd()`; injected for tests). */
7
+ cwd?: string;
8
+ }
9
+ export declare function freezeSplitCommand(opts: FreezeSplitOptions): Promise<void>;
10
+ //# sourceMappingURL=spine-freeze-split.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spine-freeze-split.d.ts","sourceRoot":"","sources":["../../src/commands/spine-freeze-split.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wGAAwG;IACxG,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6FAA6F;IAC7F,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuLhF"}