@mmnto/totem 1.118.0 → 1.119.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 (117) hide show
  1. package/dist/artifacts/admission.d.ts +12 -12
  2. package/dist/artifacts/verdict.d.ts +16 -16
  3. package/dist/compile-manifest.d.ts +89 -0
  4. package/dist/compile-manifest.d.ts.map +1 -1
  5. package/dist/compile-manifest.js +180 -31
  6. package/dist/compile-manifest.js.map +1 -1
  7. package/dist/compile-manifest.test.js +169 -1
  8. package/dist/compile-manifest.test.js.map +1 -1
  9. package/dist/compiler-schema.d.ts +1067 -0
  10. package/dist/compiler-schema.d.ts.map +1 -1
  11. package/dist/compiler-schema.js +204 -1
  12. package/dist/compiler-schema.js.map +1 -1
  13. package/dist/compiler-schema.test.js +92 -0
  14. package/dist/compiler-schema.test.js.map +1 -1
  15. package/dist/compiler.d.ts +2 -6
  16. package/dist/compiler.d.ts.map +1 -1
  17. package/dist/compiler.js +6 -17
  18. package/dist/compiler.js.map +1 -1
  19. package/dist/freeze.d.ts +3 -3
  20. package/dist/index.d.ts +12 -3
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +6 -2
  23. package/dist/index.js.map +1 -1
  24. package/dist/ledger.d.ts +12 -12
  25. package/dist/lesson-format.d.ts +5 -2
  26. package/dist/lesson-format.d.ts.map +1 -1
  27. package/dist/lesson-format.js +16 -5
  28. package/dist/lesson-format.js.map +1 -1
  29. package/dist/lesson-format.test.js +11 -0
  30. package/dist/lesson-format.test.js.map +1 -1
  31. package/dist/regex-safety/apply-rules-bounded.d.ts +11 -0
  32. package/dist/regex-safety/apply-rules-bounded.d.ts.map +1 -1
  33. package/dist/regex-safety/apply-rules-bounded.js +59 -5
  34. package/dist/regex-safety/apply-rules-bounded.js.map +1 -1
  35. package/dist/regex-validation.d.ts +7 -0
  36. package/dist/regex-validation.d.ts.map +1 -0
  37. package/dist/regex-validation.js +32 -0
  38. package/dist/regex-validation.js.map +1 -0
  39. package/dist/rule-engine.d.ts +11 -1
  40. package/dist/rule-engine.d.ts.map +1 -1
  41. package/dist/rule-engine.js +125 -18
  42. package/dist/rule-engine.js.map +1 -1
  43. package/dist/spine/authored-rule.d.ts +669 -245
  44. package/dist/spine/authored-rule.d.ts.map +1 -1
  45. package/dist/spine/authored-rule.js +113 -27
  46. package/dist/spine/authored-rule.js.map +1 -1
  47. package/dist/spine/authored-rule.test.js +170 -4
  48. package/dist/spine/authored-rule.test.js.map +1 -1
  49. package/dist/spine/authoring-ledger.d.ts +69 -10
  50. package/dist/spine/authoring-ledger.d.ts.map +1 -1
  51. package/dist/spine/authoring-ledger.js +46 -25
  52. package/dist/spine/authoring-ledger.js.map +1 -1
  53. package/dist/spine/authoring-ledger.test.js +20 -7
  54. package/dist/spine/authoring-ledger.test.js.map +1 -1
  55. package/dist/spine/candidate-rule.d.ts +18 -1
  56. package/dist/spine/candidate-rule.d.ts.map +1 -1
  57. package/dist/spine/candidate-rule.js.map +1 -1
  58. package/dist/spine/cert-corpus-seed.d.ts +8 -8
  59. package/dist/spine/compile.d.ts +4 -1
  60. package/dist/spine/compile.d.ts.map +1 -1
  61. package/dist/spine/compile.js +50 -3
  62. package/dist/spine/compile.js.map +1 -1
  63. package/dist/spine/compile.test.js +189 -23
  64. package/dist/spine/compile.test.js.map +1 -1
  65. package/dist/spine/frozen-split.d.ts +18 -18
  66. package/dist/spine/ledgers.d.ts +24 -24
  67. package/dist/spine/lf-normalize.d.ts +9 -0
  68. package/dist/spine/lf-normalize.d.ts.map +1 -0
  69. package/dist/spine/lf-normalize.js +38 -0
  70. package/dist/spine/lf-normalize.js.map +1 -0
  71. package/dist/spine/preimage-differential.d.ts +3 -1
  72. package/dist/spine/preimage-differential.d.ts.map +1 -1
  73. package/dist/spine/preimage-differential.js +9 -6
  74. package/dist/spine/preimage-differential.js.map +1 -1
  75. package/dist/spine/preimage-differential.test.js +59 -0
  76. package/dist/spine/preimage-differential.test.js.map +1 -1
  77. package/dist/spine/record-exemplars.fixture.d.ts +5 -0
  78. package/dist/spine/record-exemplars.fixture.d.ts.map +1 -0
  79. package/dist/spine/record-exemplars.fixture.js +61 -0
  80. package/dist/spine/record-exemplars.fixture.js.map +1 -0
  81. package/dist/spine/record-lower.d.ts +90 -0
  82. package/dist/spine/record-lower.d.ts.map +1 -0
  83. package/dist/spine/record-lower.js +418 -0
  84. package/dist/spine/record-lower.js.map +1 -0
  85. package/dist/spine/record-lower.test.d.ts +2 -0
  86. package/dist/spine/record-lower.test.d.ts.map +1 -0
  87. package/dist/spine/record-lower.test.js +562 -0
  88. package/dist/spine/record-lower.test.js.map +1 -0
  89. package/dist/spine/record-runtime.d.ts +215 -0
  90. package/dist/spine/record-runtime.d.ts.map +1 -0
  91. package/dist/spine/record-runtime.js +330 -0
  92. package/dist/spine/record-runtime.js.map +1 -0
  93. package/dist/spine/record-runtime.test.d.ts +2 -0
  94. package/dist/spine/record-runtime.test.d.ts.map +1 -0
  95. package/dist/spine/record-runtime.test.js +814 -0
  96. package/dist/spine/record-runtime.test.js.map +1 -0
  97. package/dist/spine/rule-record.d.ts +864 -0
  98. package/dist/spine/rule-record.d.ts.map +1 -0
  99. package/dist/spine/rule-record.js +781 -0
  100. package/dist/spine/rule-record.js.map +1 -0
  101. package/dist/spine/rule-record.test.d.ts +2 -0
  102. package/dist/spine/rule-record.test.d.ts.map +1 -0
  103. package/dist/spine/rule-record.test.js +1262 -0
  104. package/dist/spine/rule-record.test.js.map +1 -0
  105. package/dist/spine/windtunnel-firing.d.ts.map +1 -1
  106. package/dist/spine/windtunnel-firing.js +28 -1
  107. package/dist/spine/windtunnel-firing.js.map +1 -1
  108. package/dist/spine/windtunnel-lock.d.ts +10 -10
  109. package/dist/stage4-verifier.d.ts.map +1 -1
  110. package/dist/stage4-verifier.js +61 -17
  111. package/dist/stage4-verifier.js.map +1 -1
  112. package/dist/sys/glob.d.ts +30 -0
  113. package/dist/sys/glob.d.ts.map +1 -1
  114. package/dist/sys/glob.js +62 -1
  115. package/dist/sys/glob.js.map +1 -1
  116. package/dist/types.d.ts +1 -1
  117. package/package.json +1 -1
@@ -0,0 +1,562 @@
1
+ // ─── Prop 310 § Design 14 — conformance suite, slice 2: LOWERING ─────────────
2
+ //
3
+ // Slice 1's suite pins what the parser ADMITS; this one pins what lowering DOES
4
+ // with what was admitted. The § Design 12 obligation under test is total
5
+ // lowering: "every construct the parser admits either lands on the compiled
6
+ // record or fails compile LOUD — no construct is accepted at parse and dropped at
7
+ // compile." Each cannot-lower construct class gets a negative fixture, each
8
+ // verbatim carry gets a positive one, and the freeze boundary gets a guard that
9
+ // fails the moment the record path starts sanitizing (or the legacy path stops).
10
+ import * as fs from 'node:fs';
11
+ import { fileURLToPath } from 'node:url';
12
+ import { describe, expect, it } from 'vitest';
13
+ import { stringify as yamlStringify } from 'yaml';
14
+ import { extensionToLanguage } from '../ast-classifier.js';
15
+ import { extensionToLang, resolveAstGrepLangs } from '../ast-grep-query.js';
16
+ import { canonicalStringify } from '../compile-manifest.js';
17
+ import { fileMatchesGlobs, sanitizeFileGlobs } from '../compiler.js';
18
+ import { CompiledRuleSchema, CompiledRulesFileSchema } from '../compiler-schema.js';
19
+ import { design4ExemplarRecord, design8ExemplarRecord } from './record-exemplars.fixture.js';
20
+ import { compileRuleRecord, languageProbeGlobs, resolveRecordLanguage, V1_INEXPRESSIBLE_NAPI_KEYS, } from './record-lower.js';
21
+ import { isRecordPathRule, RECORD_COMPILED_HOME_KEYS, ruleAppliesToFile, } from './record-runtime.js';
22
+ import { parseRuleRecord, RequiresScopeSchema, RuleCurationSchema, RuleRecordExampleSchema, } from './rule-record.js';
23
+ const FILE = '.totem/rules/fail-open-catch.rule.yaml';
24
+ /**
25
+ * The size of the shipped legacy corpus. A CONSTANT, not a floor, because the
26
+ * `rule-compilation` freeze means nothing regenerates `.totem/compiled-rules.json`
27
+ * — so this number cannot drift while the freeze stands. When the freeze lifts and
28
+ * the corpus is regenerated or migrated, this updates ONCE, deliberately, and the
29
+ * update is the signal that the corpus moved.
30
+ */
31
+ const SHIPPED_RULE_COUNT = 485;
32
+ /** A well-formed ADR-112 §8 minted id (16 lowercase hex, no collision suffix). */
33
+ const RULE_ID = '0123456789abcdef';
34
+ const NOW = '2026-08-21T00:00:00.000Z';
35
+ function lower(record, ruleId = RULE_ID) {
36
+ const parsed = parseRuleRecord(yamlStringify(record), FILE);
37
+ return compileRuleRecord(parsed, { ruleId, now: NOW });
38
+ }
39
+ /** Lower and assert success, returning the compiled rule (a rejection fails loudly, with its reason). */
40
+ function lowerOk(record, ruleId = RULE_ID) {
41
+ const outcome = lower(record, ruleId);
42
+ if (outcome.kind !== 'compiled') {
43
+ throw new Error(`expected a compiled outcome, got rejected: ${outcome.reason}`);
44
+ }
45
+ return outcome.rule;
46
+ }
47
+ /** Lower and assert rejection, returning the reason (a compile fails loudly). */
48
+ function lowerRejected(record) {
49
+ const outcome = lower(record);
50
+ if (outcome.kind !== 'rejected') {
51
+ throw new Error('expected a rejected outcome, got a compiled rule');
52
+ }
53
+ return outcome.reason;
54
+ }
55
+ /** A minimal dialect-clean ast-grep record (compound tree payload). */
56
+ function astGrepRecord() {
57
+ return {
58
+ schemaVersion: 1,
59
+ severity: 'error',
60
+ message: 'Catch blocks must re-throw or route the error.',
61
+ target: {
62
+ type: 'ast-grep',
63
+ language: 'typescript',
64
+ rule: { kind: 'catch_clause' },
65
+ scope: { fileGlobs: ['packages/**/*.ts'] },
66
+ },
67
+ examples: [
68
+ {
69
+ bad: 'try { risky() } catch (e) { log(e) }',
70
+ good: 'try { risky() } catch (e) { throw e }',
71
+ },
72
+ ],
73
+ };
74
+ }
75
+ /** A minimal dialect-clean regex record. */
76
+ function regexRecord() {
77
+ return {
78
+ schemaVersion: 1,
79
+ severity: 'warning',
80
+ message: 'git output-consuming commands must pin LC_ALL=C on the same line.',
81
+ target: {
82
+ type: 'regex',
83
+ pattern: '\\bgit\\s+(log|diff|status)\\b',
84
+ scope: { fileGlobs: ['**/*.sh'] },
85
+ },
86
+ examples: [{ bad: 'git log --oneline', good: 'LC_ALL=C git log --oneline' }],
87
+ };
88
+ }
89
+ // ─── A. The compiled homes (§ Design 12) + mined-path byte identity ──────────
90
+ describe('CompiledRuleSchema additions — the § Design 12 compiled homes', () => {
91
+ const repoRoot = fileURLToPath(new URL('../../../../', import.meta.url));
92
+ const manifestPath = `${repoRoot}.totem/compiled-rules.json`;
93
+ const rawManifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
94
+ it('reads a NON-EMPTY corpus at the expected size (the floor the sweeps stand on)', () => {
95
+ // Without this, every assertion below is self-referentially vacuous: an empty
96
+ // or truncated `rules` array satisfies "all rules re-validate", "no rule
97
+ // carries a record field", and "every rule scopes identically" trivially, and
98
+ // the suite would go green on a corpus that had silently disappeared.
99
+ expect(rawManifest.rules.length).toBe(SHIPPED_RULE_COUNT);
100
+ });
101
+ it('re-validates the shipped 485-rule manifest BYTE-IDENTICALLY under the extended schema', () => {
102
+ // The freeze-compatibility proof (Amendment R11 / § Data model deltas): the
103
+ // additions are optional, so the frozen corpus parses unchanged — and
104
+ // "unchanged" is checked on the MANIFEST-HASH basis (canonical, key-sorted),
105
+ // which is the identity that actually matters to `verify-manifest`. A
106
+ // required addition, or one that introduced a default, would move every hash.
107
+ const parsed = CompiledRulesFileSchema.parse(rawManifest);
108
+ expect(parsed.rules.length).toBe(SHIPPED_RULE_COUNT);
109
+ expect(canonicalStringify(parsed.rules)).toBe(canonicalStringify(rawManifest.rules));
110
+ });
111
+ it('leaves every legacy rule OUTSIDE the record path — the discriminator cannot flip one', () => {
112
+ // The runtime reads field PRESENCE as the record-path discriminator, so this
113
+ // is what makes "legacy rules keep their matching behaviour byte-for-byte" a
114
+ // fact rather than an intention. If a future writer ever puts one of these
115
+ // fields on a mined rule, this fails before the matcher silently changes.
116
+ expect(rawManifest.rules.length).toBe(SHIPPED_RULE_COUNT);
117
+ const carriers = rawManifest.rules.filter((rule) => RECORD_COMPILED_HOME_KEYS.some((key) => rule[key] !== undefined));
118
+ expect(carriers).toEqual([]);
119
+ const compiled = CompiledRulesFileSchema.parse(rawManifest).rules;
120
+ expect(compiled.filter(isRecordPathRule)).toEqual([]);
121
+ });
122
+ it('keys the record path on `examples` ALONE — a cosmetic field never flips a matcher', () => {
123
+ // `examples` is the EXACT discriminator: § Design 5 makes it non-omittable
124
+ // and the lowering emits it unconditionally. A wider "any compiled home"
125
+ // test would let a legacy-shaped rule that merely gained a `recoveryHint`
126
+ // silently switch matchers — flipping the same `*.ts` glob from the shipped
127
+ // tree-wide reading to the record dialect's root-only one.
128
+ const base = {
129
+ lessonHash: 'fedcba9876543210',
130
+ lessonHeading: 'legacy',
131
+ pattern: 'x',
132
+ message: 'm',
133
+ engine: 'regex',
134
+ compiledAt: NOW,
135
+ fileGlobs: ['*.ts'],
136
+ };
137
+ expect(isRecordPathRule(CompiledRuleSchema.parse(base))).toBe(false);
138
+ expect(isRecordPathRule(CompiledRuleSchema.parse({ ...base, recoveryHint: 'try harder' }))).toBe(false);
139
+ expect(isRecordPathRule(CompiledRuleSchema.parse({ ...base, verificationShadow: { type: 'rego', source: 'p' } }))).toBe(false);
140
+ // The deliberate contract: `examples` present ⇒ record path.
141
+ expect(isRecordPathRule(CompiledRuleSchema.parse({ ...base, examples: [{ bad: 'b', good: 'g' }] }))).toBe(true);
142
+ // And every rule this slice lowers carries it.
143
+ expect(isRecordPathRule(lowerOk(regexRecord()))).toBe(true);
144
+ });
145
+ it('CORPUS SWEEP: every legacy rule scopes IDENTICALLY under the shared predicate', () => {
146
+ // The reviewer's sweep, promoted to a standing test. `ruleAppliesToFile` is
147
+ // now the single scope predicate for both lint dispatchers, Stage 4, and the
148
+ // wind tunnel, so "legacy behaviour is byte-identical" has to be a measured
149
+ // property of the whole shipped corpus, not a claim about one code path.
150
+ const compiled = CompiledRulesFileSchema.parse(rawManifest).rules;
151
+ expect(compiled.length).toBe(SHIPPED_RULE_COUNT);
152
+ const paths = [
153
+ 'a.ts',
154
+ 'src/a.ts',
155
+ 'packages/core/src/a.ts',
156
+ 'packages/core/src/a.test.ts',
157
+ 'scripts/x.sh',
158
+ 'deep/nest/mod.rs',
159
+ 'README.md',
160
+ 'src/a.tsx',
161
+ '.github/workflows/ci.yml',
162
+ 'packages/cli/src/index.cjs',
163
+ ];
164
+ let compared = 0;
165
+ for (const rule of compiled) {
166
+ for (const filePath of paths) {
167
+ const shipped = rule.fileGlobs && rule.fileGlobs.length > 0
168
+ ? fileMatchesGlobs(filePath, rule.fileGlobs)
169
+ : true;
170
+ expect(ruleAppliesToFile(rule, filePath)).toBe(shipped);
171
+ compared += 1;
172
+ }
173
+ }
174
+ expect(compared).toBe(compiled.length * paths.length);
175
+ });
176
+ it('accepts a rule carrying NONE of the additions (every one is optional)', () => {
177
+ const minimal = CompiledRuleSchema.parse({
178
+ lessonHash: 'abcdef0123456789',
179
+ lessonHeading: 'legacy',
180
+ pattern: 'foo',
181
+ message: 'no',
182
+ engine: 'regex',
183
+ compiledAt: NOW,
184
+ });
185
+ for (const key of RECORD_COMPILED_HOME_KEYS) {
186
+ expect(minimal[key]).toBeUndefined();
187
+ }
188
+ });
189
+ it('couples the compiled `requires.scope` enum to the grammar’s RequiresScopeSchema', () => {
190
+ // `compiler-schema.ts` is an import-graph leaf and cannot import the grammar
191
+ // (it would close a cycle), so the two enums are mirrored in source and
192
+ // COUPLED here. `block` stays reserved-unimplemented on both sides.
193
+ const rule = lowerOk({ ...regexRecord(), requires: { pattern: 'x', scope: 'file' } });
194
+ expect(RequiresScopeSchema.options).toEqual(['line', 'file']);
195
+ expect(rule.requires?.scope).toBe('file');
196
+ for (const scope of RequiresScopeSchema.options) {
197
+ expect(CompiledRuleSchema.safeParse({
198
+ lessonHash: RULE_ID,
199
+ lessonHeading: 'h',
200
+ pattern: 'p',
201
+ message: 'm',
202
+ engine: 'regex',
203
+ compiledAt: NOW,
204
+ requires: { pattern: 'x', scope },
205
+ }).success).toBe(true);
206
+ }
207
+ expect(CompiledRuleSchema.safeParse({
208
+ lessonHash: RULE_ID,
209
+ lessonHeading: 'h',
210
+ pattern: 'p',
211
+ message: 'm',
212
+ engine: 'regex',
213
+ compiledAt: NOW,
214
+ requires: { pattern: 'x', scope: 'block' },
215
+ }).success).toBe(false);
216
+ });
217
+ it('couples the compiled `examples` and `curation` shapes to the grammar’s schemas', () => {
218
+ expect(Object.keys(RuleRecordExampleSchema.shape).sort()).toEqual(['bad', 'good']);
219
+ expect(Object.keys(RuleCurationSchema.innerType().shape).sort()).toEqual([
220
+ 'baseline5Phase',
221
+ 'curatedAt',
222
+ 'curatedBy',
223
+ 'sourceLesson',
224
+ ]);
225
+ const rule = lowerOk(design4ExemplarRecord());
226
+ expect(Object.keys(rule.examples[0]).sort()).toEqual(['bad', 'good']);
227
+ expect(Object.keys(rule.curation).sort()).toEqual([
228
+ 'baseline5Phase',
229
+ 'curatedAt',
230
+ 'curatedBy',
231
+ 'sourceLesson',
232
+ ]);
233
+ });
234
+ });
235
+ // ─── B. The freeze boundary (§ Design 7 conformance scope) ───────────────────
236
+ describe('freeze guard — sanitizeFileGlobs is untouched and never runs on the record path', () => {
237
+ it('keeps the legacy brace EXPANSION byte-for-byte', () => {
238
+ expect(sanitizeFileGlobs(['**/*.{ts,js}'])).toEqual(['**/*.ts', '**/*.js']);
239
+ expect(sanitizeFileGlobs(['src/*.{ts,tsx,js}'])).toEqual(['src/*.ts', 'src/*.tsx', 'src/*.js']);
240
+ });
241
+ it('keeps the legacy shallow-glob PROMOTION byte-for-byte', () => {
242
+ expect(sanitizeFileGlobs(['*.ts'])).toEqual(['**/*.ts']);
243
+ expect(sanitizeFileGlobs(['*'])).toEqual(['**/*']);
244
+ expect(sanitizeFileGlobs(['!*.ts'])).toEqual(['!**/*.ts']);
245
+ expect(sanitizeFileGlobs(['src/*.ts'])).toEqual(['src/*.ts']);
246
+ });
247
+ it('carries record globs VERBATIM — no promotion, no expansion, no trimming', () => {
248
+ // The negative half of the two guards above: the same `*.ts` the sanitizer
249
+ // promotes tree-wide survives lowering unchanged. Braces never reach here
250
+ // (a parse error), so the only observable transform would be promotion.
251
+ const record = regexRecord();
252
+ record.target.scope = {
253
+ fileGlobs: ['*.ts', 'src/*.ts', '**/*.sh'],
254
+ excludeGlobs: ['**/*.test.ts'],
255
+ };
256
+ const rule = lowerOk(record);
257
+ expect(rule.fileGlobs).toEqual(['*.ts', 'src/*.ts', '**/*.sh']);
258
+ expect(rule.excludeGlobs).toEqual(['**/*.test.ts']);
259
+ });
260
+ });
261
+ // ─── C. § Design 6 — language resolution moves to the declared language ──────
262
+ describe('§ Design 6 — the declared language resolves against the registry', () => {
263
+ it('resolves a registered language and reports its representative extension', () => {
264
+ const resolution = resolveRecordLanguage('typescript');
265
+ expect(resolution.resolved).toBe(true);
266
+ if (!resolution.resolved)
267
+ return;
268
+ expect(resolution.language).toBe('typescript');
269
+ expect(['.cts', '.mts', '.ts']).toContain(resolution.extension);
270
+ });
271
+ it('fails loud on an unresolvable language, naming the registry as the authority', () => {
272
+ const resolution = resolveRecordLanguage('rust');
273
+ expect(resolution.resolved).toBe(false);
274
+ if (resolution.resolved)
275
+ return;
276
+ expect(resolution.reason).toContain('§ Design 6');
277
+ expect(resolution.reason).toContain('extensionToLanguage registry');
278
+ expect(resolution.reason).toContain('typescript');
279
+ });
280
+ it('pins the validator probe to EXACTLY one Lang (coupling guard on resolveAstGrepLangs)', () => {
281
+ // The record path pins `validateAstGrepPattern` to one grammar by handing it
282
+ // a probe glob carrying one registered extension. That indirection is only
283
+ // safe while the shipped derivation still maps one extension to one Lang —
284
+ // so this asserts the coupling instead of trusting it.
285
+ for (const language of ['typescript', 'tsx', 'javascript']) {
286
+ const resolution = resolveRecordLanguage(language);
287
+ expect(resolution.resolved).toBe(true);
288
+ if (!resolution.resolved)
289
+ continue;
290
+ const langs = resolveAstGrepLangs(languageProbeGlobs(resolution.extension));
291
+ expect(langs).toEqual([extensionToLang(resolution.extension)]);
292
+ expect(langs).toHaveLength(1);
293
+ }
294
+ });
295
+ it('validates under the DECLARED language, not a permissive fallback (the “moves” row)', () => {
296
+ // `type_alias_declaration` exists in the TypeScript/TSX grammars and not in
297
+ // JavaScript. The shipped validator falls back to `Lang.Tsx` — its most
298
+ // permissive parser — whenever a glob carries no registered extension, and
299
+ // accepts a pattern under ANY resolved Lang; the record path resolves ONLY
300
+ // the declared language and validates under exactly it. Since the language⇄
301
+ // glob floor now requires the scope to agree with the declaration, the globs
302
+ // co-vary — but they never reach the validator, which sees only the
303
+ // language-derived probe.
304
+ const typescript = astGrepRecord();
305
+ const tsTarget = typescript.target;
306
+ tsTarget.rule = { kind: 'type_alias_declaration' };
307
+ tsTarget.scope = { fileGlobs: ['**/*.ts'] };
308
+ expect(lower(typescript).kind).toBe('compiled');
309
+ const javascript = astGrepRecord();
310
+ const jsTarget = javascript.target;
311
+ jsTarget.language = 'javascript';
312
+ jsTarget.rule = { kind: 'type_alias_declaration' };
313
+ jsTarget.scope = { fileGlobs: ['**/*.js'] };
314
+ const reason = lowerRejected(javascript);
315
+ // The PAYLOAD gate rejected it — not the consistency floor. That distinction
316
+ // is what makes this a language-pinning test rather than a scope test.
317
+ expect(reason).toContain('target.rule failed ast-grep validation');
318
+ expect(reason).toContain("declared language 'javascript'");
319
+ expect(reason).toContain('try-each-glob-derived-Lang');
320
+ });
321
+ });
322
+ // ─── § Design 6 — the language⇄glob consistency floor ────────────────────────
323
+ describe('§ Design 6 — an ast-grep scope must agree with its declared language', () => {
324
+ function astGrepScoped(language, fileGlobs, excludeGlobs) {
325
+ const record = astGrepRecord();
326
+ const target = record.target;
327
+ target.language = language;
328
+ target.scope = { fileGlobs, ...(excludeGlobs ? { excludeGlobs } : {}) };
329
+ return record;
330
+ }
331
+ it('rejects a scope whose extension resolves to a DIFFERENT language', () => {
332
+ // The demonstrated gap: this lowered clean before the floor, and the runtime
333
+ // — which dispatches ast-grep by file extension — would then evaluate a
334
+ // TypeScript-validated payload under the JavaScript grammar.
335
+ const reason = lowerRejected(astGrepScoped('typescript', ['**/*.js']));
336
+ expect(reason).toContain('§ Design 6');
337
+ expect(reason).toContain("targets language 'javascript'");
338
+ expect(reason).toContain("declares 'typescript'");
339
+ expect(reason).toContain('N records');
340
+ });
341
+ it('rejects `.tsx` under `language: typescript` — the registry says they are different grammars', () => {
342
+ // `extensionToLanguage('.tsx')` is `'tsx'`, a distinct SupportedLanguage with
343
+ // its own WASM loader and its own napi `Lang`. Admitting it under
344
+ // `typescript` would reopen exactly the gap this floor closes, so the
345
+ // mechanical rule governs: a `.tsx` scope declares `language: tsx`.
346
+ expect(extensionToLanguage('.tsx')).toBe('tsx');
347
+ const reason = lowerRejected(astGrepScoped('typescript', ['**/*.ts', '**/*.tsx']));
348
+ expect(reason).toContain("targets language 'tsx'");
349
+ expect(lower(astGrepScoped('tsx', ['**/*.tsx', '**/*.jsx'])).kind).toBe('compiled');
350
+ });
351
+ it('accepts MULTIPLE globs that all resolve to the declared language', () => {
352
+ expect(lower(astGrepScoped('typescript', ['**/*.ts', '**/*.mts', 'packages/**/*.cts'])).kind).toBe('compiled');
353
+ });
354
+ it('rejects an EXTENSION-LESS glob on an ast-grep target', () => {
355
+ const reason = lowerRejected(astGrepScoped('typescript', ['packages/**']));
356
+ expect(reason).toContain('carries no file extension');
357
+ expect(reason).toContain('§ Design 6');
358
+ });
359
+ it('rejects an UNREGISTERED extension it cannot confirm', () => {
360
+ const reason = lowerRejected(astGrepScoped('typescript', ['**/*.rs']));
361
+ expect(reason).toContain("extension '.rs', which is not registered");
362
+ });
363
+ it('EXEMPTS excludeGlobs — an exclusion only ever narrows', () => {
364
+ const outcome = lower(astGrepScoped('typescript', ['packages/**/*.ts'], ['**/*.test.js', 'vendor/**']));
365
+ expect(outcome.kind).toBe('compiled');
366
+ });
367
+ it('leaves REGEX targets unchecked — a regex payload has no grammar binding', () => {
368
+ const record = regexRecord();
369
+ record.target.scope = {
370
+ fileGlobs: ['**/*.js', 'packages/**', '**/*.rs'],
371
+ };
372
+ expect(lower(record).kind).toBe('compiled');
373
+ });
374
+ });
375
+ // ─── D. Cannot-lower negatives, one per construct class ──────────────────────
376
+ describe('§ Design 12 — a construct that cannot lower fails compile LOUD', () => {
377
+ it('rejects a bad regex in `requires.pattern` (gated on EVERY engine)', () => {
378
+ const reason = lowerRejected({
379
+ ...regexRecord(),
380
+ requires: { pattern: '(a+)+$', scope: 'line' },
381
+ });
382
+ expect(reason).toContain('§ Design 8');
383
+ expect(reason).toContain('requires.pattern');
384
+ expect(reason).toContain('ReDoS');
385
+ });
386
+ it('gates `requires.pattern` on an ast-grep rule too — the check is engine-independent', () => {
387
+ const reason = lowerRejected({
388
+ ...astGrepRecord(),
389
+ requires: { pattern: '(a+)+$', scope: 'file' },
390
+ });
391
+ expect(reason).toContain('§ Design 8');
392
+ expect(reason).toContain('independent of target.type');
393
+ });
394
+ it('rejects `requires.scope: line` on an ast-grep target (span-vs-line ruling)', () => {
395
+ // An ast-grep match is a SPAN. Reading it as its start line makes the verdict
396
+ // depend on how the author wrapped the source, and § Design 8 reserves
397
+ // `block` — the span's natural unit — as unimplemented, so V1 rejects rather
398
+ // than shipping a formatting-dependent semantic.
399
+ const reason = lowerRejected({
400
+ ...astGrepRecord(),
401
+ requires: { pattern: 'LC_ALL=C', scope: 'line' },
402
+ });
403
+ expect(reason).toContain('§ Design 8');
404
+ expect(reason).toContain('an ast-grep match is a SPAN');
405
+ expect(reason).toContain('`block`');
406
+ });
407
+ it('keeps `line` valid on regex and `file` valid on BOTH engines', () => {
408
+ expect(lower({ ...regexRecord(), requires: { pattern: 'x', scope: 'line' } }).kind).toBe('compiled');
409
+ expect(lower({ ...regexRecord(), requires: { pattern: 'x', scope: 'file' } }).kind).toBe('compiled');
410
+ expect(lower({ ...astGrepRecord(), requires: { pattern: 'x', scope: 'file' } }).kind).toBe('compiled');
411
+ });
412
+ it('rejects an unresolvable `language`', () => {
413
+ const record = astGrepRecord();
414
+ record.target.language = 'brainfuck';
415
+ const reason = lowerRejected(record);
416
+ expect(reason).toContain('§ Design 6');
417
+ expect(reason).toContain("'brainfuck' is not registered");
418
+ });
419
+ it('rejects a malformed ast-grep tree at the engine gate', () => {
420
+ const record = astGrepRecord();
421
+ record.target.rule = { notARule: 1 };
422
+ const reason = lowerRejected(record);
423
+ expect(reason).toContain('§ Design 6');
424
+ expect(reason).toContain('target.rule failed ast-grep validation');
425
+ });
426
+ it('rejects a bad regex in `target.pattern`', () => {
427
+ const record = regexRecord();
428
+ record.target.pattern = '(';
429
+ const reason = lowerRejected(record);
430
+ expect(reason).toContain('§ Design 6');
431
+ expect(reason).toContain('invalid syntax');
432
+ });
433
+ it('rejects V1-inexpressible NapiConfig siblings smuggled into the rule tree', () => {
434
+ for (const key of V1_INEXPRESSIBLE_NAPI_KEYS) {
435
+ const record = astGrepRecord();
436
+ record.target.rule = { kind: 'catch_clause', [key]: {} };
437
+ const reason = lowerRejected(record);
438
+ expect(reason).toContain('operator ruling 2026-08-21');
439
+ expect(reason).toContain(`'${key}' is a NapiConfig SIBLING`);
440
+ expect(reason).toContain('construct-gap');
441
+ }
442
+ });
443
+ it('THROWS on a malformed ruleId — identity is a producer contract, not authored content', () => {
444
+ expect(() => lower(regexRecord(), 'not-a-minted-id')).toThrow(/malformed ruleId/);
445
+ expect(() => lower(regexRecord(), '')).toThrow(/malformed ruleId/);
446
+ // A 16-hex base with the mint's own collision suffix is well-formed.
447
+ expect(lowerOk(regexRecord(), '0123456789abcdef-2').lessonHash).toBe('0123456789abcdef-2');
448
+ });
449
+ it('THROWS on a record key with no defined lowering (the runtime totality check)', () => {
450
+ // A key that got past the parser — via a cast, a schema/table desync, or a
451
+ // future grammar edit that forgot this file — must never be silently dropped.
452
+ const parsed = parseRuleRecord(yamlStringify(regexRecord()), FILE);
453
+ const smuggled = {
454
+ ...parsed,
455
+ record: { ...parsed.record, futureConstruct: 'x' },
456
+ };
457
+ expect(() => compileRuleRecord(smuggled, { ruleId: RULE_ID, now: NOW })).toThrow(/record key 'futureConstruct' has no defined lowering/);
458
+ });
459
+ it('THROWS on an engine-binding divergence — the tamper guard fires (defence in depth)', () => {
460
+ // Honest scope, per the falsification round: this divergence is UNREACHABLE
461
+ // from any parse-valid record, because slice 1's `RuleTargetSchema` already
462
+ // kills the payload/type mismatch class at parse (pattern XOR rule, per
463
+ // type). The assert is therefore defence in depth against a future lowering
464
+ // edit or a hand-built `ParsedRuleRecord`, NOT a live § Design 3 gate — and
465
+ // what this test demonstrates is that the guard fires on tampered input.
466
+ const parsed = parseRuleRecord(yamlStringify(regexRecord()), FILE);
467
+ const tampered = { ...parsed, derivedEngine: 'ast-grep' };
468
+ expect(() => compileRuleRecord(tampered, { ruleId: RULE_ID, now: NOW })).toThrow(/declared target.type 'ast-grep' but its payload compiled as 'regex'/);
469
+ });
470
+ });
471
+ // ─── E. Identity, verbatim carries, and the tree-form ruling ─────────────────
472
+ describe('lowering — identity, verbatim carries, and the derived NapiConfig wrapper', () => {
473
+ it('takes identity as an INPUT: lessonHash ← ruleId, never a dslSource hash', () => {
474
+ const rule = lowerOk(regexRecord());
475
+ expect(rule.lessonHash).toBe(RULE_ID);
476
+ expect(rule.lessonHeading).toBe(`Prop 310 rule record (${RULE_ID})`);
477
+ // The heading is NOT a copy of the author's message (Tenet 20 — one home).
478
+ expect(rule.lessonHeading).not.toBe(rule.message);
479
+ });
480
+ it('mints Yellow: unverified true, legitimacy and ruleClass absent', () => {
481
+ const rule = lowerOk(regexRecord());
482
+ expect(rule.unverified).toBe(true);
483
+ expect(rule.legitimacy).toBeUndefined();
484
+ expect(rule.ruleClass).toBeUndefined();
485
+ expect(rule.compiledAt).toBe(NOW);
486
+ expect(rule.createdAt).toBe(NOW);
487
+ });
488
+ it('carries every § Design 4 construct verbatim onto the compiled rule', () => {
489
+ const record = design4ExemplarRecord();
490
+ const rule = lowerOk(record);
491
+ expect(rule.severity).toBe('error');
492
+ expect(rule.message).toBe(record.message);
493
+ expect(rule.recoveryHint).toBe(record.recoveryHint);
494
+ expect(rule.examples).toEqual(record.examples);
495
+ expect(rule.curation).toEqual(record.curation);
496
+ expect(rule.fileGlobs).toEqual(['packages/**/*.ts']);
497
+ expect(rule.excludeGlobs).toEqual(['**/*.test.ts']);
498
+ expect(rule.language).toBe('typescript');
499
+ expect(rule.engine).toBe('ast-grep');
500
+ });
501
+ it('renames `verification_shadow` → `verificationShadow` exactly once, verbatim', () => {
502
+ const record = design4ExemplarRecord();
503
+ const rule = lowerOk(record);
504
+ expect(rule.verificationShadow).toEqual(record.verification_shadow);
505
+ // The snake_case record key never survives onto the compiled artifact.
506
+ expect(rule.verification_shadow).toBeUndefined();
507
+ });
508
+ it('derives the NapiConfig wrapper from the rule TREE (operator ruling 2026-08-21)', () => {
509
+ const record = design4ExemplarRecord();
510
+ const rule = lowerOk(record);
511
+ const tree = record.target.rule;
512
+ // `{rule: <tree>}` plus the napi language derived from the RESOLVED
513
+ // `target.language` — so the record carries no duplicate language home.
514
+ expect(rule.astGrepYamlRule).toEqual({ rule: tree, language: extensionToLang('.ts') });
515
+ expect(rule.astGrepPattern).toBeUndefined();
516
+ expect(rule.pattern).toBe('');
517
+ });
518
+ it('routes a FLAT ast-grep payload to astGrepPattern, still language-pinned', () => {
519
+ const record = astGrepRecord();
520
+ const target = record.target;
521
+ delete target.rule;
522
+ target.pattern = 'console.log($A)';
523
+ const rule = lowerOk(record);
524
+ expect(rule.astGrepPattern).toBe('console.log($A)');
525
+ expect(rule.astGrepYamlRule).toBeUndefined();
526
+ expect(rule.language).toBe('typescript');
527
+ });
528
+ it('omits `language` for a regex rule — the grammar forbids it there', () => {
529
+ const rule = lowerOk(regexRecord());
530
+ expect(rule.language).toBeUndefined();
531
+ expect(rule.pattern).toBe('\\bgit\\s+(log|diff|status)\\b');
532
+ });
533
+ it('omits every optional home the record did not declare', () => {
534
+ const rule = lowerOk(regexRecord());
535
+ expect(rule.excludeGlobs).toBeUndefined();
536
+ expect(rule.requires).toBeUndefined();
537
+ expect(rule.curation).toBeUndefined();
538
+ expect(rule.verificationShadow).toBeUndefined();
539
+ expect(rule.recoveryHint).toBeUndefined();
540
+ });
541
+ it('does NOT mirror examples onto the legacy badExample/goodExample pair', () => {
542
+ // Amendment 1 makes the record's `examples` the single hand-editable home;
543
+ // projecting it onto the legacy pair would be a second copy (Tenet 20).
544
+ const rule = lowerOk(design4ExemplarRecord());
545
+ expect(rule.badExample).toBeUndefined();
546
+ expect(rule.goodExample).toBeUndefined();
547
+ expect(rule.examples).toHaveLength(1);
548
+ });
549
+ it('is deterministic — the same record and inputs lower to a deep-equal rule', () => {
550
+ expect(lowerOk(design4ExemplarRecord())).toEqual(lowerOk(design4ExemplarRecord()));
551
+ });
552
+ it('lowers BOTH Prop 310 exemplars (slice 1 parse → slice 2 compile)', () => {
553
+ const design4 = lowerOk(design4ExemplarRecord());
554
+ expect(design4.engine).toBe('ast-grep');
555
+ const design8 = lowerOk(design8ExemplarRecord());
556
+ expect(design8.engine).toBe('regex');
557
+ expect(design8.requires).toEqual({ pattern: 'LC_ALL=C', scope: 'line' });
558
+ expect(design8.fileGlobs).toEqual(['**/*.sh', '**/*.cjs']);
559
+ expect(design8.severity).toBe('warning');
560
+ });
561
+ });
562
+ //# sourceMappingURL=record-lower.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-lower.test.js","sourceRoot":"","sources":["../../src/spine/record-lower.test.ts"],"names":[],"mappings":"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"}