@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.
- package/dist/compile-smoke-gate.d.ts +23 -0
- package/dist/compile-smoke-gate.d.ts.map +1 -1
- package/dist/compile-smoke-gate.js +139 -8
- package/dist/compile-smoke-gate.js.map +1 -1
- package/dist/compile-smoke-gate.test.js +431 -0
- package/dist/compile-smoke-gate.test.js.map +1 -1
- package/dist/config-schema.d.ts +52 -4
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config-schema.js +73 -4
- package/dist/config-schema.js.map +1 -1
- package/dist/config-schema.test.js +93 -1
- package/dist/config-schema.test.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/orchestration-resolver.d.ts.map +1 -1
- package/dist/orchestration-resolver.js +9 -2
- package/dist/orchestration-resolver.js.map +1 -1
- package/dist/orchestration-resolver.test.js +8 -0
- package/dist/orchestration-resolver.test.js.map +1 -1
- package/dist/recurrence-stats.d.ts +10 -10
- package/dist/spine/authored-rule.d.ts +18 -18
- package/dist/spine/authoring-ledger.d.ts +14 -14
- package/dist/spine/cert-corpus-seed.d.ts +6 -6
- package/dist/spine/ledgers.d.ts +62 -62
- package/dist/spine/windtunnel-lock.d.ts +16 -16
- package/package.json +1 -1
|
@@ -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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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":"AAAA
|
|
1
|
+
{"version":3,"file":"compile-smoke-gate.js","sourceRoot":"","sources":["../src/compile-smoke-gate.ts"],"names":[],"mappings":"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"}
|