@mmnto/totem 1.119.0 → 1.121.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.
@@ -14,6 +14,29 @@
14
14
  * input. Any divergence between "smoke gate happy" and "runtime happy" is a
15
15
  * bug in this module, not a rule authoring problem.
16
16
  *
17
+ * Prop 310 § Design 8 PASS TWO (mmnto-ai/totem#2678): the match predicate is
18
+ * "the target matched AND the required context is ABSENT", so a gate that ran
19
+ * only pass one WAS that divergence — a `requires:`-bearing record's `good`
20
+ * example keeps the target and adds the companion, so the gate read it as
21
+ * over-matching and no such record could pass `totem rule test` or the ADR-112
22
+ * §4 preimage differential. The gate therefore evaluates the requirement with
23
+ * the RUNTIME'S OWN evaluator (`requiresSuppressesMatch`, `spine/record-runtime.ts`)
24
+ * — the same function `rule-engine.ts` and `regex-safety/apply-rules-bounded.ts`
25
+ * call. One evaluator, never a second implementation of § Design 8 living here
26
+ * (Tenet 20: derive or couple, never mirror). Legacy rules carry no `requires`
27
+ * and are byte-identical by construction — every call site is guarded on
28
+ * `rule.requires !== undefined` so no legacy rule pays a second test.
29
+ *
30
+ * Borrowing the evaluator means borrowing its PRECONDITIONS: `runSmokeGate` runs
31
+ * `assertNoTornRecordRules` on every rule, and adds
32
+ * `assertRequiresPatternsSafe` / `assertNoAstGrepLineScope` for a
33
+ * `requires:`-bearing one, before evaluating it — two of these at each regex
34
+ * dispatcher, all three at the ast dispatcher, in each case at invocation
35
+ * altitude. Without them the gate ACCEPTED rules the runtime refuses — a torn
36
+ * rule, an unsafe-but-compilable `requires.pattern` that backtracks
37
+ * catastrophically, and `ast-grep` + `requires.scope: line` — which is the same
38
+ * gate-vs-runtime divergence this module exists to rule out.
39
+ *
17
40
  * Not wired to Pipeline 1 (manual) rules in mmnto/totem#1408 - a dry-run
18
41
  * sweep lands in a follow-up ticket before the Pipeline 1 gate flips on.
19
42
  */
@@ -1 +1 @@
1
- {"version":3,"file":"compile-smoke-gate.d.ts","sourceRoot":"","sources":["../src/compile-smoke-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzD,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAuGD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CA8BjF"}
1
+ {"version":3,"file":"compile-smoke-gate.d.ts","sourceRoot":"","sources":["../src/compile-smoke-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAWzD,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAoJD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAiEjF"}
@@ -14,10 +14,35 @@
14
14
  * input. Any divergence between "smoke gate happy" and "runtime happy" is a
15
15
  * bug in this module, not a rule authoring problem.
16
16
  *
17
+ * Prop 310 § Design 8 PASS TWO (mmnto-ai/totem#2678): the match predicate is
18
+ * "the target matched AND the required context is ABSENT", so a gate that ran
19
+ * only pass one WAS that divergence — a `requires:`-bearing record's `good`
20
+ * example keeps the target and adds the companion, so the gate read it as
21
+ * over-matching and no such record could pass `totem rule test` or the ADR-112
22
+ * §4 preimage differential. The gate therefore evaluates the requirement with
23
+ * the RUNTIME'S OWN evaluator (`requiresSuppressesMatch`, `spine/record-runtime.ts`)
24
+ * — the same function `rule-engine.ts` and `regex-safety/apply-rules-bounded.ts`
25
+ * call. One evaluator, never a second implementation of § Design 8 living here
26
+ * (Tenet 20: derive or couple, never mirror). Legacy rules carry no `requires`
27
+ * and are byte-identical by construction — every call site is guarded on
28
+ * `rule.requires !== undefined` so no legacy rule pays a second test.
29
+ *
30
+ * Borrowing the evaluator means borrowing its PRECONDITIONS: `runSmokeGate` runs
31
+ * `assertNoTornRecordRules` on every rule, and adds
32
+ * `assertRequiresPatternsSafe` / `assertNoAstGrepLineScope` for a
33
+ * `requires:`-bearing one, before evaluating it — two of these at each regex
34
+ * dispatcher, all three at the ast dispatcher, in each case at invocation
35
+ * altitude. Without them the gate ACCEPTED rules the runtime refuses — a torn
36
+ * rule, an unsafe-but-compilable `requires.pattern` that backtracks
37
+ * catastrophically, and `ast-grep` + `requires.scope: line` — which is the same
38
+ * gate-vs-runtime divergence this module exists to rule out.
39
+ *
17
40
  * Not wired to Pipeline 1 (manual) rules in mmnto/totem#1408 - a dry-run
18
41
  * sweep lands in a follow-up ticket before the Pipeline 1 gate flips on.
19
42
  */
20
43
  import { matchAstGrepPattern, TRAILING_EXT_RE } from './ast-grep-query.js';
44
+ import { TotemParseError } from './errors.js';
45
+ import { assertNoAstGrepLineScope, assertNoTornRecordRules, assertRequiresPatternsSafe, requiresSuppressesMatch, } from './spine/record-runtime.js';
21
46
  // ─── Helpers ────────────────────────────────────────
22
47
  function firstLine(message) {
23
48
  const m = /^[^\n]*/.exec(message);
@@ -30,11 +55,36 @@ function lineNumbersFor(snippet) {
30
55
  result.push(i);
31
56
  return result;
32
57
  }
58
+ /**
59
+ * Prop 310 § Design 8 pass two at ONE target-match locus, for the gate.
60
+ *
61
+ * The snippet IS the file for a gate run — the exemplar is the whole text the
62
+ * rule is being asked about — so `scope: file` resolves to the entire snippet
63
+ * and `scope: line` to the matched line. The `file` resolver is the snippet
64
+ * itself rather than a read, which is what makes the gate PURE where the runtime
65
+ * dispatchers hand `requiresSuppressesMatch` a lazy disk read.
66
+ *
67
+ * Guarded on `rule.requires !== undefined` so a legacy rule never pays a second
68
+ * `re.test`, and so this is provably a no-op for the frozen 485-rule corpus.
69
+ *
70
+ * `requiresSuppressesMatch` THROWS `TotemParseError` on an uncompilable
71
+ * `requires.pattern`, and nothing here catches it — but that throw is
72
+ * unreachable via `runSmokeGate`, which runs `assertRequiresPatternsSafe`
73
+ * first and whose `validateRegex` compiles the pattern before the safe-regex2
74
+ * check, so an uncompilable one is reported as a precondition failure before any
75
+ * evaluation. The uncaught path remains as a BACKSTOP for a caller that reaches
76
+ * this helper another way; `runSmokeGate` handles it once, for both engines.
77
+ */
78
+ function suppressedByRequires(rule, line, snippet) {
79
+ if (rule.requires === undefined)
80
+ return false;
81
+ return requiresSuppressesMatch(rule, { line, file: () => snippet });
82
+ }
33
83
  // ─── Engine runners ─────────────────────────────────
34
- function runRegexGate(pattern, snippet) {
84
+ function runRegexGate(rule, snippet) {
35
85
  let re;
36
86
  try {
37
- re = new RegExp(pattern);
87
+ re = new RegExp(rule.pattern);
38
88
  }
39
89
  catch (err) {
40
90
  return {
@@ -45,7 +95,11 @@ function runRegexGate(pattern, snippet) {
45
95
  }
46
96
  let matchCount = 0;
47
97
  for (const line of snippet.split('\n')) {
48
- if (re.test(line))
98
+ // The FULL match predicate, exactly as `rule-engine.ts`'s regex dispatcher
99
+ // states it: target hit AND required context absent. A line whose
100
+ // requirement is satisfied is not a match at all, so it never reaches the
101
+ // count.
102
+ if (re.test(line) && !suppressedByRequires(rule, line, snippet))
49
103
  matchCount++;
50
104
  }
51
105
  return matchCount > 0 ? { matched: true, matchCount } : { matched: false, matchCount: 0 };
@@ -97,15 +151,29 @@ function runAstGrepGate(pattern, snippet, rule) {
97
151
  const lineNumbers = lineNumbersFor(snippet);
98
152
  let lastReason;
99
153
  for (const ext of inferBadExampleExts(rule)) {
154
+ // Seeded EMPTY so a throwing extension needs no statement inside the catch:
155
+ // the filter below yields nothing, the loop moves to the next extension, and
156
+ // the shipped degrade-to-`lastReason` behaviour is unchanged.
157
+ let matches = [];
100
158
  try {
101
- const matches = matchAstGrepPattern(snippet, ext, pattern, lineNumbers);
102
- if (matches.length > 0) {
103
- return { matched: true, matchCount: matches.length };
104
- }
159
+ matches = matchAstGrepPattern(snippet, ext, pattern, lineNumbers);
105
160
  }
106
161
  catch (err) {
107
162
  lastReason = `ast-grep runtime error: ${firstLine(err instanceof Error ? err.message : String(err))}`;
108
163
  }
164
+ // § Design 8 pass two, OUTSIDE the engine try/catch on purpose: a
165
+ // `requires.pattern` defect is not an ast-grep runtime error and must not be
166
+ // reported as one. Via `runSmokeGate` such a pattern is already refused by
167
+ // `assertRequiresPatternsSafe` before this line runs; keeping the filter out
168
+ // of the catch means that even a throw from the evaluator itself reaches
169
+ // `runSmokeGate`'s single handler rather than being mislabelled here.
170
+ const unsuppressed = matches.filter((match) => !suppressedByRequires(rule, match.lineText, snippet));
171
+ // Zero UNSUPPRESSED matches under this extension is a miss like any other:
172
+ // fall through to the next extension, because the gate still passes on ANY
173
+ // extension (runtime scans the same surface).
174
+ if (unsuppressed.length > 0) {
175
+ return { matched: true, matchCount: unsuppressed.length };
176
+ }
109
177
  }
110
178
  return lastReason
111
179
  ? { matched: false, matchCount: 0, reason: lastReason }
@@ -126,8 +194,71 @@ export function runSmokeGate(rule, snippet) {
126
194
  if (!snippet || snippet.trim().length === 0) {
127
195
  return { matched: false, matchCount: 0 };
128
196
  }
197
+ try {
198
+ // § Design 12 — UNCONDITIONAL, because tornness is not a property of
199
+ // `requires`. The assert fires on ANY of the seven
200
+ // `RECORD_COMPILED_HOME_KEYS` without `examples`, and the runtime refuses
201
+ // such a rule because it is UNCLASSIFIABLE — neither record nor legacy —
202
+ // not to protect an evaluator. Scoping this to `requires` left
203
+ // `{fileGlobs, excludeGlobs}` with no `examples` passing the gate while
204
+ // `applyRulesToAdditions` threw on it. Legacy rules stay byte-identical for
205
+ // free: the assert early-returns for a rule carrying no § Design 12 home,
206
+ // and the byte-identity guard pins that none of the frozen 485 carries one.
207
+ assertNoTornRecordRules([rule]);
208
+ if (rule.requires !== undefined) {
209
+ // The evaluator's PRECONDITIONS, taken with the evaluator (Tenet 20: a
210
+ // borrowed function borrows its contract too). Each regex dispatcher runs
211
+ // TWO of these at invocation altitude before any `requiresSuppressesMatch`
212
+ // (`rule-engine.ts:596-597`, `regex-safety/apply-rules-bounded.ts:92-93`);
213
+ // the ast dispatcher runs all three (`rule-engine.ts:791-793`). A gate that
214
+ // skipped them accepted rules the runtime REFUSES:
215
+ // - an unsafe-but-compilable `requires.pattern` (`(a+)+$`) that runs to
216
+ // catastrophic backtracking here, unbounded, against whole-snippet
217
+ // text — `totem rule test` reaches this with no safe-regex2 pass of
218
+ // its own;
219
+ // - `ast-grep` + `requires.scope: line`, which the lowering rejects and
220
+ // `assertNoAstGrepLineScope` refuses at runtime.
221
+ // The ast dispatcher also carries a tree-sitter `requires` backstop this
222
+ // gate does not need: an `ast`-engine rule never reaches an evaluator here
223
+ // because `dispatchEngineGate` already returns
224
+ // `smoke gate does not yet cover engine: ast` — a neutral skip the callers
225
+ // read toward flagging.
226
+ assertRequiresPatternsSafe([rule]);
227
+ assertNoAstGrepLineScope([rule]);
228
+ }
229
+ return dispatchEngineGate(rule, snippet);
230
+ }
231
+ catch (err) {
232
+ // The ONE handler for § Design 8's fail-loud arm, shared by all three
233
+ // preconditions. It also still catches `requiresSuppressesMatch`'s own throw
234
+ // on an uncompilable pattern, but only as a BACKSTOP: `validateRegex`
235
+ // compiles the pattern first, so `assertRequiresPatternsSafe` reports that
236
+ // defect ("unusable `requires.pattern` (invalid syntax)") and the evaluator's
237
+ // throw is unreachable from this function. It stays handled for a caller
238
+ // that reaches the evaluator by another route. A gate that propagated any of
239
+ // these would crash `totem rule test` instead of reporting the rule as
240
+ // unusable; each message already names the construct at fault
241
+ // (`requires.pattern` / `requires.scope: line` / `examples`), so the prefix
242
+ // names no construct of its own. That is load-bearing, not stylistic:
243
+ // `assertNoTornRecordRules` runs on EVERY rule, so this handler also fronts
244
+ // rules carrying no `requires` block at all, and a `requires`-specific prefix
245
+ // would misname exactly that case (CodeRabbit, bot round 1). Mirrors the
246
+ // `invalid regex:` shape the target pattern already gets. Anything else is a
247
+ // real bug: rethrow.
248
+ if (err instanceof TotemParseError) {
249
+ return {
250
+ matched: false,
251
+ matchCount: 0,
252
+ reason: `rule precondition failed: ${firstLine(err.message)}`,
253
+ };
254
+ }
255
+ throw err;
256
+ }
257
+ }
258
+ /** Engine dispatch for `runSmokeGate`, split out so the § Design 8 catch wraps both engines exactly once. */
259
+ function dispatchEngineGate(rule, snippet) {
129
260
  if (rule.engine === 'regex') {
130
- return runRegexGate(rule.pattern, snippet);
261
+ return runRegexGate(rule, snippet);
131
262
  }
132
263
  if (rule.engine === 'ast-grep') {
133
264
  const source = rule.astGrepPattern ?? rule.astGrepYamlRule;
@@ -1 +1 @@
1
- {"version":3,"file":"compile-smoke-gate.js","sourceRoot":"","sources":["../src/compile-smoke-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compile-smoke-gate.js","sourceRoot":"","sources":["../src/compile-smoke-gate.ts"],"names":[],"mappings":"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"}