@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.
@@ -1,6 +1,13 @@
1
1
  import { describe, expect, it } from 'vitest';
2
+ import { stringify as yamlStringify } from 'yaml';
2
3
  import { matchAstGrepPattern } from './ast-grep-query.js';
3
4
  import { runSmokeGate } from './compile-smoke-gate.js';
5
+ import { applyRulesToAdditionsBounded } from './regex-safety/apply-rules-bounded.js';
6
+ import { RegexEvaluator } from './regex-safety/evaluator.js';
7
+ import { applyAstRulesToAdditions, applyRulesToAdditions } from './rule-engine.js';
8
+ import { design8ExemplarRecord } from './spine/record-exemplars.fixture.js';
9
+ import { compileRuleRecord } from './spine/record-lower.js';
10
+ import { parseRuleRecord } from './spine/rule-record.js';
4
11
  // ─── Helpers ────────────────────────────────────────
5
12
  function makeRegexRule(overrides = {}) {
6
13
  return {
@@ -56,6 +63,23 @@ function makeCompoundRule(overrides = {}) {
56
63
  ...overrides,
57
64
  };
58
65
  }
66
+ // ─── Prop 310 § Design 8 fixtures ────────────────────
67
+ /** § Design 8's exemplar target: the git verbs whose output must be locale-pinned. */
68
+ const GIT_TARGET = '\\bgit\\s+(log|diff|status)\\b';
69
+ /**
70
+ * The exemplar's snippets, named ONCE.
71
+ *
72
+ * Each is inert fixture TEXT handed to `runSmokeGate` as rule INPUT — neither
73
+ * this suite nor the dispatcher drive below runs a git command. The shipped
74
+ * git-hygiene lessons that fire on the bare forms are ADVISORY here (regex
75
+ * engine, no `ruleClass` ⇒ not hard-tier ⇒ excluded from the lint exit code), so
76
+ * they are left to report rather than overridden; hoisting keeps them to one
77
+ * finding per distinct literal.
78
+ */
79
+ const BARE_LOG = 'git log --oneline';
80
+ const PINNED_DIFF = 'LC_ALL=C git diff HEAD';
81
+ /** The § Design 8 good example: the same target with the companion on the SAME line. */
82
+ const PINNED_LOG = `LC_ALL=C ${BARE_LOG}`;
59
83
  // ─── runSmokeGate: regex rules ───────────────────────
60
84
  describe('runSmokeGate — regex engine', () => {
61
85
  it('matches when the badExample contains the pattern', () => {
@@ -263,6 +287,293 @@ describe('runSmokeGate over-matching check', () => {
263
287
  expect(result.matchCount).toBe(0);
264
288
  });
265
289
  });
290
+ // ─── Prop 310 § Design 8 — `requires:` pass two ──────
291
+ describe('runSmokeGate — Prop 310 § Design 8 requires (mmnto-ai/totem#2678)', () => {
292
+ /** § Design 8's own exemplar, as a hand-built compiled rule. */
293
+ function makeRequiresRegexRule(requires, overrides = {}) {
294
+ return makeRegexRule({
295
+ lessonHeading: 'git output-consuming commands must pin LC_ALL=C',
296
+ pattern: GIT_TARGET,
297
+ message: 'git output-consuming commands must pin LC_ALL=C on the same line.',
298
+ requires,
299
+ examples: [{ bad: BARE_LOG, good: PINNED_LOG }],
300
+ ...overrides,
301
+ });
302
+ }
303
+ describe('regex engine, scope: line', () => {
304
+ const rule = makeRequiresRegexRule({ pattern: 'LC_ALL=C', scope: 'line' });
305
+ it('FIRES on the bad example — target present, requirement absent', () => {
306
+ const result = runSmokeGate(rule, BARE_LOG);
307
+ expect(result.matched).toBe(true);
308
+ expect(result.matchCount).toBe(1);
309
+ });
310
+ it('stays SILENT on the good example — the defect #2678 fixed', () => {
311
+ // Pre-fix the gate ran pass ONE only, so the good example (which keeps the
312
+ // target and adds the companion) read as over-matching and no
313
+ // `requires:`-bearing record could pass `totem rule test`.
314
+ const result = runSmokeGate(rule, PINNED_LOG);
315
+ expect(result.matched).toBe(false);
316
+ expect(result.matchCount).toBe(0);
317
+ // Silence for the RIGHT reason: "the snippet simply contains nothing the
318
+ // rule fires on", which callers read as good-silent, not as a gate refusal.
319
+ expect(result.reason).toBeUndefined();
320
+ });
321
+ it('counts only the unsatisfied loci in a mixed snippet', () => {
322
+ const result = runSmokeGate(rule, `${BARE_LOG}\n${PINNED_DIFF}`);
323
+ expect(result.matched).toBe(true);
324
+ expect(result.matchCount).toBe(1);
325
+ });
326
+ });
327
+ describe('regex engine, scope: file', () => {
328
+ const fileScoped = makeRequiresRegexRule({ pattern: 'LC_ALL=C', scope: 'file' });
329
+ /** Target on one line, companion on ANOTHER — satisfied at file scope only. */
330
+ const SPLIT_SNIPPET = `export LC_ALL=C\n${BARE_LOG}`;
331
+ it('stays SILENT when the companion sits on a different line', () => {
332
+ const result = runSmokeGate(fileScoped, SPLIT_SNIPPET);
333
+ expect(result.matched).toBe(false);
334
+ expect(result.matchCount).toBe(0);
335
+ expect(result.reason).toBeUndefined();
336
+ });
337
+ it('FIRES when the companion is nowhere in the snippet', () => {
338
+ const result = runSmokeGate(fileScoped, BARE_LOG);
339
+ expect(result.matched).toBe(true);
340
+ expect(result.matchCount).toBe(1);
341
+ });
342
+ it('still FIRES on the same snippet at scope: line — the scope distinction is real', () => {
343
+ const lineScoped = makeRequiresRegexRule({ pattern: 'LC_ALL=C', scope: 'line' });
344
+ const result = runSmokeGate(lineScoped, SPLIT_SNIPPET);
345
+ expect(result.matched).toBe(true);
346
+ expect(result.matchCount).toBe(1);
347
+ });
348
+ });
349
+ describe('ast-grep flat pattern, scope: file', () => {
350
+ const rule = makeAstGrepStringRule({
351
+ requires: { pattern: '// debug-ok', scope: 'file' },
352
+ examples: [{ bad: 'debugger;\n', good: '// debug-ok\ndebugger;\n' }],
353
+ });
354
+ it('FIRES on the bad example', () => {
355
+ const result = runSmokeGate(rule, 'debugger;\n');
356
+ expect(result.matched).toBe(true);
357
+ expect(result.matchCount).toBe(1);
358
+ });
359
+ it('stays SILENT on the good example', () => {
360
+ const result = runSmokeGate(rule, '// debug-ok\ndebugger;\n');
361
+ expect(result.matched).toBe(false);
362
+ expect(result.matchCount).toBe(0);
363
+ expect(result.reason).toBeUndefined();
364
+ });
365
+ });
366
+ describe('ast-grep compound (astGrepYamlRule), scope: file', () => {
367
+ const BAD = 'try {\n work();\n} catch (err) {\n}\n';
368
+ const GOOD = '// catch is intentionally empty — see the ticket\n' + BAD;
369
+ const rule = makeCompoundRule({
370
+ requires: { pattern: 'intentionally empty', scope: 'file' },
371
+ // `examples` is non-optional for a `requires:` rule: without it the rule is
372
+ // TORN (a § Design 12 home with no discriminator) and the gate's
373
+ // `assertNoTornRecordRules` precondition refuses it, as the runtime does.
374
+ examples: [{ bad: BAD, good: GOOD }],
375
+ });
376
+ it('FIRES on the bad example', () => {
377
+ const result = runSmokeGate(rule, BAD);
378
+ expect(result.matched).toBe(true);
379
+ expect(result.matchCount).toBe(1);
380
+ });
381
+ it('stays SILENT on the good example', () => {
382
+ const result = runSmokeGate(rule, GOOD);
383
+ expect(result.matched).toBe(false);
384
+ expect(result.matchCount).toBe(0);
385
+ expect(result.reason).toBeUndefined();
386
+ });
387
+ });
388
+ // ── `lastReason` fall-through under the requires filter (bot round 1) ──
389
+ //
390
+ // CodeRabbit asked whether one extension can THROW while another returns
391
+ // matches that the requirement then SUPPRESSES, and noted the PR's evidence
392
+ // did not establish such an input. It does exist, and this is it: the pattern
393
+ // below is MULTI-ROOT under the TypeScript grammar (which has no JSX) and
394
+ // single-root under TSX, so `.ts` throws "Multiple AST nodes are detected"
395
+ // while `.tsx` parses it and matches the JSX snippet.
396
+ //
397
+ // Two constraints shape the construction, and are worth stating so the next
398
+ // reader does not re-derive them:
399
+ // - `requires.scope` must be `file` here — `assertNoAstGrepLineScope`
400
+ // refuses `line` on an ast-grep rule, so a per-locus companion is not
401
+ // expressible;
402
+ // - at `file` scope suppression is a property of the SNIPPET, not of the
403
+ // match, so the companion silences every extension's matches at once. A
404
+ // variant where ext A is suppressed and ext B is not is therefore NOT
405
+ // constructible for ast-grep at all.
406
+ describe('lastReason fall-through under the requires filter (mmnto-ai/totem#2681)', () => {
407
+ const JSX_PATTERN = '<div>{console.log($$$)}</div>';
408
+ const JSX_SNIPPET = 'const el = <div>{console.log("hi")}</div>;\n';
409
+ const COMPANION = '// debug-ok\n';
410
+ /** `.ts` first, `.tsx` second — the throwing grammar is tried first. */
411
+ function jsxRule(overrides = {}) {
412
+ return makeAstGrepStringRule({
413
+ astGrepPattern: JSX_PATTERN,
414
+ fileGlobs: ['**/*.ts', '**/*.tsx'],
415
+ requires: { pattern: '// debug-ok', scope: 'file' },
416
+ examples: [{ bad: JSX_SNIPPET, good: COMPANION + JSX_SNIPPET }],
417
+ ...overrides,
418
+ });
419
+ }
420
+ it('keeps a throwing extension reason when a LATER extension matches but is fully suppressed', () => {
421
+ const result = runSmokeGate(jsxRule(), COMPANION + JSX_SNIPPET);
422
+ expect(result.matched).toBe(false);
423
+ expect(result.matchCount).toBe(0);
424
+ // PINNED as current behaviour, not asserted as ideal: `.tsx` did evaluate,
425
+ // and the requirement WAS satisfied, yet the reason reported is `.ts`'s
426
+ // engine throw. The gate keeps `lastReason` because a pattern that cannot
427
+ // compile under a DECLARED extension is a real defect worth surfacing —
428
+ // the requires filter neither masks it nor replaces it. Callers read the
429
+ // good-example leg off `matched` alone, so this reason only ever appears
430
+ // in the `bad did not fire (...)` line, where it is the useful fact.
431
+ expect(result.reason).toMatch(/ast-grep runtime error/);
432
+ expect(result.reason).toMatch(/Multiple AST nodes/);
433
+ });
434
+ it('FIRES on the same rule and snippet with the companion removed', () => {
435
+ // The falsifier for the test above: without this, that one could pass
436
+ // because EVERY extension threw and nothing was ever suppressed. Here the
437
+ // `.tsx` leg demonstrably matches, so the fall-through above really is the
438
+ // requires filter emptying a non-empty match set.
439
+ const result = runSmokeGate(jsxRule(), JSX_SNIPPET);
440
+ expect(result.matched).toBe(true);
441
+ expect(result.matchCount).toBe(1);
442
+ expect(result.reason).toBeUndefined();
443
+ });
444
+ it('keeps the reason when EVERY extension throws and `requires` is present', () => {
445
+ // The degenerate arm: a bare `catch` clause is multi-root under every
446
+ // grammar in the set, so no extension ever produces a match to filter.
447
+ const rule = jsxRule({ astGrepPattern: 'catch ($E) { $$$ }' });
448
+ const result = runSmokeGate(rule, COMPANION + 'try { work() } catch (err) {}\n');
449
+ expect(result.matched).toBe(false);
450
+ expect(result.matchCount).toBe(0);
451
+ expect(result.reason).toMatch(/ast-grep runtime error/);
452
+ });
453
+ });
454
+ describe('the evaluator’s PRECONDITIONS are enforced, never propagated', () => {
455
+ // Each of these is refused by a runtime dispatcher before any
456
+ // `requiresSuppressesMatch` runs. A gate that skipped them would ACCEPT a
457
+ // rule the runtime rejects — the exact divergence this module rules out.
458
+ // All are unreachable from a compiled record (the lowering gates them) and
459
+ // reachable from a hand-built `CompiledRule` or a hand-edited manifest.
460
+ it('assertRequiresPatternsSafe refuses an UNCOMPILABLE pattern (regex engine)', () => {
461
+ // `validateRegex` COMPILES before it runs safe-regex2, so an uncompilable
462
+ // pattern is a precondition failure — reported as `invalid syntax` — and
463
+ // never reaches `requiresContextPresent`'s own throw.
464
+ const rule = makeRequiresRegexRule({ pattern: '(', scope: 'line' });
465
+ const result = runSmokeGate(rule, BARE_LOG);
466
+ expect(result.matched).toBe(false);
467
+ expect(result.matchCount).toBe(0);
468
+ expect(result.reason).toMatch(/requires\.pattern/);
469
+ expect(result.reason).toMatch(/invalid syntax/);
470
+ });
471
+ it('assertRequiresPatternsSafe refuses it on the ast-grep engine too — one handler, both engines', () => {
472
+ const rule = makeAstGrepStringRule({
473
+ requires: { pattern: '(', scope: 'file' },
474
+ examples: [{ bad: 'debugger;\n', good: 'const x = 1;\n' }],
475
+ });
476
+ const result = runSmokeGate(rule, 'debugger;\n');
477
+ expect(result.matched).toBe(false);
478
+ expect(result.matchCount).toBe(0);
479
+ expect(result.reason).toMatch(/requires\.pattern/);
480
+ expect(result.reason).toMatch(/invalid syntax/);
481
+ // NOT mislabelled as an engine throw: the requirement is not ast-grep's.
482
+ expect(result.reason).not.toMatch(/ast-grep runtime error/);
483
+ });
484
+ it('assertRequiresPatternsSafe refuses an UNSAFE-but-compilable pattern instead of backtracking on it', () => {
485
+ // `(a+)+$` compiles fine and is a catastrophic backtracker. Measured before
486
+ // the precondition landed: 86 SECONDS inside `runSmokeGate` on this input,
487
+ // reachable straight from `totem rule test` (`loadRulesOrExit` runs no
488
+ // safe-regex2 pass of its own). This is the safe-regex2 arm of the same
489
+ // check, so the reason names ReDoS rather than a syntax defect.
490
+ const rule = makeRegexRule({
491
+ requires: { pattern: '(a+)+$', scope: 'line' },
492
+ examples: [{ bad: 'console.log(1)', good: 'logger.info(1)' }],
493
+ });
494
+ const snippet = 'console.log(1) ' + 'a'.repeat(34) + '!';
495
+ const startedAt = Date.now();
496
+ const result = runSmokeGate(rule, snippet);
497
+ const elapsedMs = Date.now() - startedAt;
498
+ expect(result.matched).toBe(false);
499
+ expect(result.matchCount).toBe(0);
500
+ expect(result.reason).toMatch(/requires\.pattern/);
501
+ expect(result.reason).toMatch(/ReDoS/);
502
+ // A gate that evaluated this pattern would still be running.
503
+ expect(elapsedMs).toBeLessThan(2000);
504
+ });
505
+ it('assertNoAstGrepLineScope refuses ast-grep + requires.scope: line, as the ast dispatcher does', () => {
506
+ // An ast-grep match is a SPAN; reading it as its start line makes the
507
+ // verdict depend on how the author wrapped their source. The lowering
508
+ // rejects the combination and `assertNoAstGrepLineScope` backstops it at
509
+ // the ast dispatcher — pre-cure this rule PASSED the gate.
510
+ const rule = makeAstGrepStringRule({
511
+ requires: { pattern: '// debug-ok', scope: 'line' },
512
+ examples: [{ bad: 'debugger;\n', good: 'debugger; // debug-ok\n' }],
513
+ });
514
+ const result = runSmokeGate(rule, 'debugger;\n');
515
+ expect(result.matched).toBe(false);
516
+ expect(result.matchCount).toBe(0);
517
+ expect(result.reason).toMatch(/requires\.scope: line/);
518
+ });
519
+ it('assertNoTornRecordRules refuses a TORN rule — `requires` present, `examples` absent', () => {
520
+ // `isRecordPathRule` keys on `examples`, so this rule would read as LEGACY
521
+ // and have its requirement silently unevaluated. § Design 12 bans the
522
+ // silence, not just the unsafe direction.
523
+ const torn = makeRegexRule({ requires: { pattern: 'LC_ALL=C', scope: 'line' } });
524
+ expect(torn.examples).toBeUndefined();
525
+ const result = runSmokeGate(torn, 'console.log(1)');
526
+ expect(result.matched).toBe(false);
527
+ expect(result.matchCount).toBe(0);
528
+ expect(result.reason).toMatch(/examples/);
529
+ });
530
+ it('assertNoTornRecordRules refuses a torn rule carrying NO `requires` — `excludeGlobs` alone', () => {
531
+ // Tornness is not a property of `requires`: the assert fires on ANY of the
532
+ // seven `RECORD_COMPILED_HOME_KEYS` without `examples`, because such a rule
533
+ // is UNCLASSIFIABLE, not because an evaluator needs protecting. With the
534
+ // torn check scoped to `requires` this rule reported `{matched: true}` from
535
+ // the gate while `applyRulesToAdditions` threw on it.
536
+ const torn = makeRegexRule({ fileGlobs: ['**/*.ts'], excludeGlobs: ['**/*.spec.ts'] });
537
+ expect(torn.requires).toBeUndefined();
538
+ expect(torn.examples).toBeUndefined();
539
+ const result = runSmokeGate(torn, 'console.log(1)');
540
+ expect(result.matched).toBe(false);
541
+ expect(result.matchCount).toBe(0);
542
+ expect(result.reason).toMatch(/examples/);
543
+ });
544
+ });
545
+ it('leaves a LEGACY rule untouched — the companion text is not magic', () => {
546
+ // No `requires` block ⇒ pass two never runs, so a snippet carrying the
547
+ // would-be companion still fires exactly as it did before #2678.
548
+ const legacy = makeRegexRule({ pattern: GIT_TARGET });
549
+ expect(legacy.requires).toBeUndefined();
550
+ const result = runSmokeGate(legacy, PINNED_LOG);
551
+ expect(result.matched).toBe(true);
552
+ expect(result.matchCount).toBe(1);
553
+ });
554
+ it('passes § Design 8’s exemplar END-TO-END through the real lowering', () => {
555
+ // The whole point of the ticket: parse → lower → gate, with no hand-built
556
+ // rule anywhere, so the gate is proved against the shape the record path
557
+ // actually emits.
558
+ const parsed = parseRuleRecord(yamlStringify(design8ExemplarRecord()), '.totem/rules/lc-all-c.rule.yaml');
559
+ const outcome = compileRuleRecord(parsed, {
560
+ ruleId: '0123456789abcdef',
561
+ now: '2026-08-24T00:00:00.000Z',
562
+ });
563
+ if (outcome.kind !== 'compiled') {
564
+ throw new Error(`expected the § Design 8 exemplar to lower, got: ${outcome.reason}`);
565
+ }
566
+ const compiled = outcome.rule;
567
+ expect(compiled.requires).toEqual({ pattern: 'LC_ALL=C', scope: 'line' });
568
+ const pair = compiled.examples?.[0];
569
+ expect(pair).toBeDefined();
570
+ const bad = runSmokeGate(compiled, pair.bad);
571
+ const good = runSmokeGate(compiled, pair.good);
572
+ expect(bad.matched).toBe(true);
573
+ expect(good.matched).toBe(false);
574
+ expect(good.reason).toBeUndefined();
575
+ });
576
+ });
266
577
  // ─── runtime-parity invariant ────────────────────────
267
578
  describe('runSmokeGate runtime parity invariant', () => {
268
579
  it('uses the same engine entry points as the runtime — gate-pass implies runtime-match', () => {
@@ -279,5 +590,125 @@ describe('runSmokeGate runtime parity invariant', () => {
279
590
  const matches = matchAstGrepPattern(snippet, '.ts', 'debugger', snippet.split('\n').map((_, i) => i + 1));
280
591
  expect(matches.length).toBeGreaterThanOrEqual(1);
281
592
  });
593
+ // ── § Design 8 parity, driven through the REAL dispatchers ──
594
+ //
595
+ // The parity claim for `requires:` (mmnto-ai/totem#2678) is that the gate's
596
+ // verdict equals `totem lint`'s. Recomputing the predicate in the test body
597
+ // with `requiresSuppressesMatch` could not establish that: it re-implemented
598
+ // `runRegexGate` and agreed with the gate whether or not the gate agreed with
599
+ // the dispatcher — it passed green while the gate was accepting rules the
600
+ // dispatchers refuse. So these drive all THREE shipped dispatchers themselves
601
+ // and compare COUNTS: `applyRulesToAdditions` (the sync regex one),
602
+ // `applyRulesToAdditionsBounded` (the regex one `totem lint` actually runs —
603
+ // `run-compiled-rules.ts:668` — and a structurally different § Design 8 path,
604
+ // eagerly awaiting whole-file text at `scope: file` rather than resolving it
605
+ // lazily), and `applyAstRulesToAdditions`.
606
+ //
607
+ // All three take an injected reader, so no snippet is ever written to disk:
608
+ // the `scope: file` resolver sees exactly the bytes the gate saw.
609
+ /** One `DiffAddition` per snippet line, as a diff of a wholly-new file produces. */
610
+ function additionsFor(snippet, file) {
611
+ const lines = snippet.split('\n');
612
+ return lines.map((line, i) => ({
613
+ file,
614
+ line,
615
+ lineNumber: i + 1,
616
+ precedingLine: i === 0 ? null : lines[i - 1],
617
+ }));
618
+ }
619
+ function engineCtx() {
620
+ return { logger: { warn: () => { } }, state: { hasWarnedShieldContext: false } };
621
+ }
622
+ const SH_FILE = 'tools/lint.sh';
623
+ const MIXED = `${BARE_LOG}\n${PINNED_DIFF}`;
624
+ // `expected` is PINNED, not derived from either side: an agreement of two
625
+ // zeroes would otherwise satisfy the equality without exercising anything.
626
+ // The two scopes disagree on MIXED — at `line` the bare locus still fires,
627
+ // at `file` the companion anywhere in the snippet silences both — so this
628
+ // also pins that the scope distinction survives each dispatcher.
629
+ const REGEX_CASES = [
630
+ { name: 'bad — target only', snippet: BARE_LOG, line: 1, file: 1 },
631
+ { name: 'good — companion on the SAME line', snippet: PINNED_LOG, line: 0, file: 0 },
632
+ { name: 'mixed — one bare locus, one companioned', snippet: MIXED, line: 1, file: 0 },
633
+ ];
634
+ /** The § Design 8 exemplar as a record-path rule scoped to the shell fixture. */
635
+ function parityRegexRule(scope) {
636
+ return makeRegexRule({
637
+ lessonHeading: 'git output-consuming commands must pin LC_ALL=C',
638
+ pattern: GIT_TARGET,
639
+ requires: { pattern: 'LC_ALL=C', scope },
640
+ fileGlobs: ['**/*.sh'],
641
+ examples: [{ bad: BARE_LOG, good: PINNED_LOG }],
642
+ });
643
+ }
644
+ it('gate matchCount equals the SYNC REGEX dispatcher’s violation count, at both scopes', () => {
645
+ for (const scope of ['line', 'file']) {
646
+ const rule = parityRegexRule(scope);
647
+ for (const c of REGEX_CASES) {
648
+ const where = `${scope} / ${c.name}`;
649
+ const expected = c[scope];
650
+ const gate = runSmokeGate(rule, c.snippet);
651
+ const violations = applyRulesToAdditions(engineCtx(), [rule], additionsFor(c.snippet, SH_FILE), undefined, process.cwd(),
652
+ // The § Design 8 `scope: file` resolver, fed the snippet instead of a
653
+ // disk read — the same seam `totem lint --staged` uses for the index.
654
+ () => c.snippet);
655
+ expect(gate.matchCount, where).toBe(expected);
656
+ expect(violations.length, where).toBe(expected);
657
+ expect(gate.matched, where).toBe(violations.length > 0);
658
+ }
659
+ }
660
+ });
661
+ it('gate matchCount equals the BOUNDED regex dispatcher’s violation count, at both scopes', async () => {
662
+ // The leg that matters most: `applyRulesToAdditionsBounded` is the dispatcher
663
+ // `totem lint` runs regex rules through (`rule-engine.ts:576-578`,
664
+ // `run-compiled-rules.ts:668`), and it reaches § Design 8 by a structurally
665
+ // different route — an EAGER `await getFileText(file)` at `scope: file`,
666
+ // where the sync dispatcher and the gate both resolve the text lazily. Parity
667
+ // measured only on the sync path would leave the shipping path unmeasured.
668
+ const evaluator = new RegexEvaluator();
669
+ try {
670
+ for (const scope of ['line', 'file']) {
671
+ const rule = parityRegexRule(scope);
672
+ for (const c of REGEX_CASES) {
673
+ const where = `bounded / ${scope} / ${c.name}`;
674
+ const expected = c[scope];
675
+ const gate = runSmokeGate(rule, c.snippet);
676
+ const { violations } = await applyRulesToAdditionsBounded(engineCtx(), [rule], additionsFor(c.snippet, SH_FILE), {
677
+ evaluator,
678
+ timeoutMode: 'strict',
679
+ repoRoot: process.cwd(),
680
+ // Same seam as the other two legs — staged mode's
681
+ // `git show :<file>` reader threads in here.
682
+ readStrategy: () => Promise.resolve(c.snippet),
683
+ });
684
+ expect(gate.matchCount, where).toBe(expected);
685
+ expect(violations.length, where).toBe(expected);
686
+ expect(gate.matched, where).toBe(violations.length > 0);
687
+ }
688
+ }
689
+ }
690
+ finally {
691
+ await evaluator.dispose();
692
+ }
693
+ });
694
+ it('gate matchCount equals the AST-GREP dispatcher’s violation count', async () => {
695
+ const TS_FILE = 'src/fixture.ts';
696
+ const rule = makeAstGrepStringRule({
697
+ requires: { pattern: '// debug-ok', scope: 'file' },
698
+ fileGlobs: ['**/*.ts'],
699
+ examples: [{ bad: 'debugger;\n', good: '// debug-ok\ndebugger;\n' }],
700
+ });
701
+ const cases = [
702
+ { snippet: 'debugger;\n', expected: 1 },
703
+ { snippet: '// debug-ok\ndebugger;\n', expected: 0 },
704
+ ];
705
+ for (const { snippet, expected } of cases) {
706
+ const gate = runSmokeGate(rule, snippet);
707
+ const violations = await applyAstRulesToAdditions(engineCtx(), [rule], additionsFor(snippet, TS_FILE), process.cwd(), undefined, undefined, () => Promise.resolve(snippet));
708
+ expect(gate.matchCount, snippet).toBe(expected);
709
+ expect(violations.length, snippet).toBe(expected);
710
+ expect(gate.matched, snippet).toBe(violations.length > 0);
711
+ }
712
+ });
282
713
  });
283
714
  //# sourceMappingURL=compile-smoke-gate.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compile-smoke-gate.test.js","sourceRoot":"","sources":["../src/compile-smoke-gate.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compile-smoke-gate.test.js","sourceRoot":"","sources":["../src/compile-smoke-gate.test.ts"],"names":[],"mappings":"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"}
@@ -1222,6 +1222,31 @@ export declare const ReviewConfigSchema: z.ZodDefault<z.ZodObject<{
1222
1222
  * other on a stale floor.
1223
1223
  */
1224
1224
  export declare const DEFAULT_SEARCH_RELEVANCE_FLOOR = 0.25;
1225
+ /**
1226
+ * Whether `value` carries a character that cannot be rendered SAFELY into the
1227
+ * managed git hooks (mmnto-ai/totem#2692 C4): a single quote (breaks the `sh`
1228
+ * single-quoted word AND the single-quoted `node -e '…'` spec-evidence reader),
1229
+ * a double quote or backslash (breaks the JS string literal inside that reader),
1230
+ * a dollar sign or a backtick (the only characters still active inside the
1231
+ * double-quoted `sh` words the hook guards use), or a control character /
1232
+ * newline (breaks both, and can forge hook lines).
1233
+ *
1234
+ * The CLI installer carries the same clause as a render-path backstop; this
1235
+ * refine is the primary gate, so a validated config never reaches it. Written as
1236
+ * a code-point walk rather than a regex so the predicate carries no escape
1237
+ * sequence of its own to mis-author.
1238
+ */
1239
+ export declare function hasUnrenderableHookChar(value: string): boolean;
1240
+ /**
1241
+ * Normalise a configured `totemDir` to the ONE spelling every consumer joins and
1242
+ * every managed hook renders (mmnto-ai/totem#2692 amendment A7): backslashes →
1243
+ * `/`, a leading `./` dropped, trailing slashes stripped. `.totem/` and `.totem`
1244
+ * name the same directory, but rendered into the hooks' `grep -q '<dir>/…'`
1245
+ * diff filters the slash produced `dir//…`, which never matched — silently.
1246
+ * `'.'` is left alone (the global profile's own spelling for "this directory");
1247
+ * an empty result is refused by the schema.
1248
+ */
1249
+ export declare function normalizeTotemDir(value: string): string;
1225
1250
  export declare const TotemConfigSchema: z.ZodObject<{
1226
1251
  /** Glob patterns and chunking strategies for each ingest target */
1227
1252
  targets: z.ZodArray<z.ZodObject<{
@@ -1731,8 +1756,26 @@ export declare const TotemConfigSchema: z.ZodObject<{
1731
1756
  } | undefined;
1732
1757
  numCtx?: number | undefined;
1733
1758
  }, unknown>>;
1734
- /** Optional: override the .totem/ directory path */
1735
- totemDir: z.ZodEffects<z.ZodDefault<z.ZodString>, string, string | undefined>;
1759
+ /**
1760
+ * Optional: override the .totem/ directory path.
1761
+ *
1762
+ * The value is RENDERED INTO the managed git hooks at install
1763
+ * (mmnto-ai/totem#2692) — the strict pre-commit spec-evidence reader, the
1764
+ * pre-push gate guards, and the post-merge / post-checkout diff filters all
1765
+ * name it — so re-run `totem hook install --force` after changing it, or the
1766
+ * installed hooks keep reading the previous directory.
1767
+ *
1768
+ * The value is normalised first — a backslash becomes `/`, a leading `./` is
1769
+ * dropped, trailing slashes are stripped (see {@link normalizeTotemDir}) — and
1770
+ * an empty result is refused. Because it is rendered into shell and into a JS
1771
+ * string literal inside the hook, and because git C-quotes non-ASCII bytes in
1772
+ * the paths the hooks' diff filters read, a value carrying a quote, a dollar
1773
+ * sign, a backtick, a non-ASCII character, a newline or a control character
1774
+ * is refused here as well as by the installer. The installer additionally
1775
+ * refuses `.`, a `..` segment and a leading `-`, shapes whose hook diff
1776
+ * filters could never match.
1777
+ */
1778
+ totemDir: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodDefault<z.ZodString>, string, string | undefined>, string, string | undefined>, string, string | undefined>, string, string | undefined>;
1736
1779
  /** Optional: override the .lancedb/ directory path */
1737
1780
  lanceDir: z.ZodEffects<z.ZodDefault<z.ZodString>, string, string | undefined>;
1738
1781
  /**
@@ -1898,8 +1941,13 @@ export declare const TotemConfigSchema: z.ZodObject<{
1898
1941
  }>]>>;
1899
1942
  /** Optional: enforcement hook tier configuration */
1900
1943
  hooks: z.ZodOptional<z.ZodObject<{
1901
- /** Enforcement tier: 'strict' adds spec-completed checks and shield gates.
1902
- * Agents are auto-detected and enforced at strict level regardless of this setting. */
1944
+ /** Enforcement tier: 'strict' adds the spec-evidence check before commit — a
1945
+ * `totem spec` run artifact under `<totemDir>/artifacts/runs/` (`.totem/artifacts/runs/`
1946
+ * unless `totemDir` overrides it; top-level
1947
+ * `admission.runMetadata.caller === 'spec'`, mmnto-ai/totem#2690) — and shield
1948
+ * gates. Agents are auto-detected and enforced at strict level regardless of
1949
+ * this setting. The tier is rendered into the hook at install, so re-run
1950
+ * `totem hook install --force` after changing it (mmnto-ai/totem#2692). */
1903
1951
  tier: z.ZodDefault<z.ZodEnum<["strict", "standard"]>>;
1904
1952
  }, "strip", z.ZodTypeAny, {
1905
1953
  tier: "strict" | "standard";