@mmnto/totem 1.14.11 → 1.14.13

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 (48) hide show
  1. package/dist/adversarial.test.js +20 -15
  2. package/dist/adversarial.test.js.map +1 -1
  3. package/dist/compile-lesson.d.ts +58 -2
  4. package/dist/compile-lesson.d.ts.map +1 -1
  5. package/dist/compile-lesson.js +307 -29
  6. package/dist/compile-lesson.js.map +1 -1
  7. package/dist/compile-lesson.test.js +491 -19
  8. package/dist/compile-lesson.test.js.map +1 -1
  9. package/dist/compiler-schema.d.ts +154 -9
  10. package/dist/compiler-schema.d.ts.map +1 -1
  11. package/dist/compiler-schema.js +88 -10
  12. package/dist/compiler-schema.js.map +1 -1
  13. package/dist/compiler.d.ts +12 -4
  14. package/dist/compiler.d.ts.map +1 -1
  15. package/dist/compiler.js +25 -5
  16. package/dist/compiler.js.map +1 -1
  17. package/dist/compiler.test.js +194 -50
  18. package/dist/compiler.test.js.map +1 -1
  19. package/dist/config-schema.d.ts +45 -0
  20. package/dist/config-schema.d.ts.map +1 -1
  21. package/dist/config-schema.js +21 -0
  22. package/dist/config-schema.js.map +1 -1
  23. package/dist/config-schema.test.js +50 -1
  24. package/dist/config-schema.test.js.map +1 -1
  25. package/dist/index.d.ts +6 -6
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -3
  28. package/dist/index.js.map +1 -1
  29. package/dist/rule-engine.d.ts +56 -13
  30. package/dist/rule-engine.d.ts.map +1 -1
  31. package/dist/rule-engine.js +62 -40
  32. package/dist/rule-engine.js.map +1 -1
  33. package/dist/rule-engine.test.js +87 -56
  34. package/dist/rule-engine.test.js.map +1 -1
  35. package/dist/rule-metrics.d.ts +40 -0
  36. package/dist/rule-metrics.d.ts.map +1 -1
  37. package/dist/rule-metrics.js +28 -0
  38. package/dist/rule-metrics.js.map +1 -1
  39. package/dist/rule-metrics.test.js +104 -3
  40. package/dist/rule-metrics.test.js.map +1 -1
  41. package/dist/rule-tester.d.ts.map +1 -1
  42. package/dist/rule-tester.js +9 -3
  43. package/dist/rule-tester.js.map +1 -1
  44. package/dist/test-utils.d.ts +9 -0
  45. package/dist/test-utils.d.ts.map +1 -1
  46. package/dist/test-utils.js +13 -0
  47. package/dist/test-utils.js.map +1 -1
  48. package/package.json +1 -1
@@ -80,23 +80,12 @@ const CONTEXT_MARKER = 'totem-context:';
80
80
  const CONTEXT_RE = /totem-context:\s*(.+)/;
81
81
  const LEGACY_CONTEXT_MARKER = 'shield-context:';
82
82
  const LEGACY_CONTEXT_RE = /shield-context:\s*(.+)/;
83
- let shieldContextDeprecationWarned = false;
84
- let coreLogger = { warn: () => { } }; // no-op default — CLI must wire its own logger
85
- function warnShieldContextDeprecation() {
86
- if (!shieldContextDeprecationWarned) {
87
- shieldContextDeprecationWarned = true;
88
- coreLogger.warn('⚠ Deprecation: "// shield-context:" is deprecated. Use "// totem-context:" instead. (See ADR-071)');
83
+ function warnShieldContextDeprecation(ctx) {
84
+ if (!ctx.state.hasWarnedShieldContext) {
85
+ ctx.state.hasWarnedShieldContext = true;
86
+ ctx.logger.warn('⚠ Deprecation: "// shield-context:" is deprecated. Use "// totem-context:" instead. (See ADR-071)');
89
87
  }
90
88
  }
91
- /** Set the logger for core diagnostics. CLI should call this at startup. */
92
- export function setCoreLogger(logger) {
93
- coreLogger = logger;
94
- }
95
- /** @internal — exposed for testing only */
96
- export function resetShieldContextWarning() {
97
- shieldContextDeprecationWarned = false;
98
- coreLogger = { warn: () => { } };
99
- }
100
89
  /**
101
90
  * Check if a line should be suppressed via inline directives.
102
91
  * Supports three forms:
@@ -107,40 +96,40 @@ export function resetShieldContextWarning() {
107
96
  * Syntax-agnostic: works with any comment style (//, #, HTML comments, block comments).
108
97
  */
109
98
  /** Check if a line contains a context directive (totem-context or legacy shield-context). */
110
- function hasContextDirective(l) {
99
+ function hasContextDirective(ctx, l) {
111
100
  if (l.includes(CONTEXT_MARKER))
112
101
  return true;
113
102
  if (l.includes(LEGACY_CONTEXT_MARKER)) {
114
- warnShieldContextDeprecation();
103
+ warnShieldContextDeprecation(ctx);
115
104
  return true;
116
105
  }
117
106
  return false;
118
107
  }
119
108
  /** Extract justification from a context directive on a single line, or null if none. */
120
- function matchContextDirective(l) {
109
+ function matchContextDirective(ctx, l) {
121
110
  const primary = l.match(CONTEXT_RE);
122
111
  if (primary)
123
112
  return primary[1].trim();
124
113
  const legacy = l.match(LEGACY_CONTEXT_RE);
125
114
  if (legacy) {
126
- warnShieldContextDeprecation();
115
+ warnShieldContextDeprecation(ctx);
127
116
  return legacy[1].trim();
128
117
  }
129
118
  return null;
130
119
  }
131
- function isSuppressed(line, precedingLine) {
120
+ function isSuppressed(ctx, line, precedingLine) {
132
121
  // Same-line: 'totem-ignore' substring also matches 'totem-ignore-next-line',
133
122
  // so directive lines themselves are inherently suppressed.
134
123
  if (line.includes(SUPPRESS_MARKER))
135
124
  return true;
136
125
  // Same-line: totem-context: or shield-context: (legacy)
137
- if (hasContextDirective(line))
126
+ if (hasContextDirective(ctx, line))
138
127
  return true;
139
128
  // Next-line: preceding line contains the next-line directive
140
129
  if (precedingLine != null && precedingLine.includes(SUPPRESS_NEXT_LINE_MARKER))
141
130
  return true;
142
131
  // Next-line: preceding line contains a context directive
143
- if (precedingLine != null && hasContextDirective(precedingLine))
132
+ if (precedingLine != null && hasContextDirective(ctx, precedingLine))
144
133
  return true;
145
134
  return false;
146
135
  }
@@ -148,15 +137,23 @@ function isSuppressed(line, precedingLine) {
148
137
  * Extract justification text from totem-context: directives.
149
138
  * Checks both the current line and the preceding line.
150
139
  * Returns empty string for plain totem-ignore (no justification).
140
+ *
141
+ * @param ctx - Per-invocation rule engine context. Required so that the legacy
142
+ * `shield-context:` deprecation path (reached via `matchContextDirective`)
143
+ * uses the caller's logger and per-ctx latch instead of module state.
144
+ * @param line - The line being evaluated.
145
+ * @param precedingLine - The line immediately before, or null at start of file.
146
+ * @returns The justification text, or empty string if the line carries a plain
147
+ * `totem-ignore` or no directive at all.
151
148
  */
152
- export function extractJustification(line, precedingLine) {
149
+ export function extractJustification(ctx, line, precedingLine) {
153
150
  // Check current line for context directive
154
- const sameLine = matchContextDirective(line);
151
+ const sameLine = matchContextDirective(ctx, line);
155
152
  if (sameLine)
156
153
  return sameLine;
157
154
  // Check preceding line for context directive
158
155
  if (precedingLine) {
159
- const prevLine = matchContextDirective(precedingLine);
156
+ const prevLine = matchContextDirective(ctx, precedingLine);
160
157
  if (prevLine)
161
158
  return prevLine;
162
159
  }
@@ -165,11 +162,20 @@ export function extractJustification(line, precedingLine) {
165
162
  }
166
163
  // ─── Regex rule execution ───────────────────────────
167
164
  /**
168
- * Apply compiled rules against pre-extracted diff additions.
165
+ * Apply compiled regex-engine rules against pre-extracted diff additions.
169
166
  * Skips additions with non-code AST context (strings, comments, regex).
170
- * Optional `onRuleEvent` callback enables observability metrics collection.
167
+ *
168
+ * @param ctx - Per-invocation rule engine context. Replaces the module-level
169
+ * logger / deprecation-warning latch that existed pre-#1441. Callers build
170
+ * one ctx per linting invocation: `{ logger, state: { hasWarnedShieldContext: false } }`.
171
+ * @param rules - The full rule list. This function filters to regex-engine
172
+ * rules internally.
173
+ * @param additions - The diff additions to evaluate.
174
+ * @param onRuleEvent - Optional observability callback for metrics collection
175
+ * on trigger / suppress / failure events.
176
+ * @returns All regex-based violations found.
171
177
  */
172
- export function applyRulesToAdditions(rules, additions, onRuleEvent) {
178
+ export function applyRulesToAdditions(ctx, rules, additions, onRuleEvent) {
173
179
  if (additions.length === 0 || rules.length === 0)
174
180
  return [];
175
181
  const violations = [];
@@ -198,12 +204,12 @@ export function applyRulesToAdditions(rules, additions, onRuleEvent) {
198
204
  continue;
199
205
  }
200
206
  // Skip if suppressed via inline directive
201
- if (isSuppressed(addition.line, addition.precedingLine)) {
207
+ if (isSuppressed(ctx, addition.line, addition.precedingLine)) {
202
208
  if (re.test(addition.line)) {
203
209
  onRuleEvent?.('suppress', rule.lessonHash, {
204
210
  file: addition.file,
205
211
  line: addition.lineNumber,
206
- justification: extractJustification(addition.line, addition.precedingLine),
212
+ justification: extractJustification(ctx, addition.line, addition.precedingLine),
207
213
  immutable: rule.immutable,
208
214
  });
209
215
  }
@@ -236,8 +242,23 @@ export function applyRulesToAdditions(rules, additions, onRuleEvent) {
236
242
  * Handles both Tree-sitter S-expression ('ast') and ast-grep ('ast-grep') engines.
237
243
  * Async because it reads files and runs Tree-sitter queries.
238
244
  * Handles fileGlobs filtering and suppression same as regex rules.
245
+ *
246
+ * @param ctx - Per-invocation rule engine context (see {@link RuleEngineContext}).
247
+ * @param rules - The full rule list. This function filters to ast / ast-grep
248
+ * rules internally.
249
+ * @param additions - The diff additions to evaluate.
250
+ * @param workingDirectory - Absolute path used to resolve file reads. Callers
251
+ * must pass the repo root, not `process.cwd()` (#1304).
252
+ * @param onRuleEvent - Optional observability callback for trigger / suppress
253
+ * / failure events.
254
+ * @param onWarn - Optional AST-path warning sink ("AST query skipped",
255
+ * "Skipped file outside project", etc.). Follow-up #1552 tracks consolidating
256
+ * this into `ctx.logger.warn`.
257
+ * @param readStrategy - Optional async reader for staged / virtual file
258
+ * content. When omitted, reads from disk.
259
+ * @returns All AST-based violations found.
239
260
  */
240
- export async function applyAstRulesToAdditions(rules, additions, workingDirectory, onRuleEvent, onWarn, readStrategy) {
261
+ export async function applyAstRulesToAdditions(ctx, rules, additions, workingDirectory, onRuleEvent, onWarn, readStrategy) {
241
262
  const treeSitterRules = rules.filter((r) => r.engine === 'ast' && r.astQuery);
242
263
  // Widen to include compound rules (mmnto/totem#1408). A rule is runnable
243
264
  // when EITHER `astGrepPattern` (string) or `astGrepYamlRule` (NapiConfig
@@ -306,11 +327,11 @@ export async function applyAstRulesToAdditions(rules, additions, workingDirector
306
327
  const matches = batchResults[i] ?? [];
307
328
  for (const match of matches) {
308
329
  const addition = fileAdditions.find((a) => a.lineNumber === match.lineNumber);
309
- if (addition && isSuppressed(addition.line, addition.precedingLine)) {
330
+ if (addition && isSuppressed(ctx, addition.line, addition.precedingLine)) {
310
331
  onRuleEvent?.('suppress', rule.lessonHash, {
311
332
  file,
312
333
  line: match.lineNumber,
313
- justification: extractJustification(addition.line, addition.precedingLine),
334
+ justification: extractJustification(ctx, addition.line, addition.precedingLine),
314
335
  immutable: rule.immutable,
315
336
  });
316
337
  continue;
@@ -389,12 +410,12 @@ export async function applyAstRulesToAdditions(rules, additions, workingDirector
389
410
  const matches = batchResults[i] ?? [];
390
411
  for (const match of matches) {
391
412
  const addition = fileAdditions.find((a) => a.lineNumber === match.lineNumber);
392
- if (addition && isSuppressed(addition.line, addition.precedingLine)) {
413
+ if (addition && isSuppressed(ctx, addition.line, addition.precedingLine)) {
393
414
  onRuleEvent?.('suppress', rule.lessonHash, {
394
415
  file,
395
416
  line: match.lineNumber,
396
417
  justification: addition
397
- ? extractJustification(addition.line, addition.precedingLine)
418
+ ? extractJustification(ctx, addition.line, addition.precedingLine)
398
419
  : '',
399
420
  immutable: rule.immutable,
400
421
  });
@@ -424,12 +445,13 @@ export async function applyAstRulesToAdditions(rules, additions, workingDirector
424
445
  * This is a convenience wrapper that only handles 'regex' engine rules.
425
446
  * For 'ast' and 'ast-grep' rules, call `applyAstRulesToAdditions` separately.
426
447
  *
427
- * @param rules The full list of compiled rules. This function filters to regex rules.
428
- * @param diff The unified diff string.
429
- * @param excludeFiles File paths to skip (e.g., compiled-rules.json to avoid self-matches).
448
+ * @param ctx - Per-invocation rule engine context (see {@link RuleEngineContext}).
449
+ * @param rules - The full list of compiled rules. This function filters to regex rules.
450
+ * @param diff - The unified diff string.
451
+ * @param excludeFiles - File paths to skip (e.g., compiled-rules.json to avoid self-matches).
430
452
  * @returns All regex-based violations found.
431
453
  */
432
- export function applyRules(rules, diff, excludeFiles) {
454
+ export function applyRules(ctx, rules, diff, excludeFiles) {
433
455
  let additions = extractAddedLines(diff);
434
456
  if (additions.length === 0 || rules.length === 0)
435
457
  return [];
@@ -437,6 +459,6 @@ export function applyRules(rules, diff, excludeFiles) {
437
459
  const excluded = new Set(excludeFiles);
438
460
  additions = additions.filter((a) => !excluded.has(a.file));
439
461
  }
440
- return applyRulesToAdditions(rules, additions);
462
+ return applyRulesToAdditions(ctx, rules, additions);
441
463
  }
442
464
  //# sourceMappingURL=rule-engine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../src/rule-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../src/rule-engine.ts"],"names":[],"mappings":"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"}
@@ -2,17 +2,18 @@ import * as fs from 'node:fs';
2
2
  import * as os from 'node:os';
3
3
  import * as path from 'node:path';
4
4
  import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
- import { applyAstRulesToAdditions, applyRulesToAdditions, extractJustification, matchesGlob, resetShieldContextWarning, setCoreLogger, } from './rule-engine.js';
6
- import { cleanTmpDir } from './test-utils.js';
5
+ import { applyAstRulesToAdditions, applyRulesToAdditions, extractJustification, matchesGlob, } from './rule-engine.js';
6
+ import { cleanTmpDir, makeRuleEngineCtx } from './test-utils.js';
7
7
  // ─── Helpers ────────────────────────────────────────
8
8
  let tmpDir;
9
+ let ctx;
9
10
  beforeEach(() => {
10
11
  tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-rule-engine-'));
11
12
  fs.mkdirSync(path.join(tmpDir, 'src'), { recursive: true });
13
+ ctx = makeRuleEngineCtx();
12
14
  });
13
15
  afterEach(() => {
14
16
  cleanTmpDir(tmpDir);
15
- resetShieldContextWarning();
16
17
  });
17
18
  function makeRule(overrides) {
18
19
  return {
@@ -40,7 +41,7 @@ describe('applyAstRulesToAdditions', () => {
40
41
  // Bad queries return empty results with a warning — prevents TS-specific node names
41
42
  // from crashing lint when run against JS files (#988)
42
43
  const warnings = [];
43
- const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, undefined, (msg) => warnings.push(msg));
44
+ const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, undefined, (msg) => warnings.push(msg));
44
45
  expect(violations).toEqual([]);
45
46
  expect(warnings.length).toBeGreaterThan(0);
46
47
  expect(warnings[0]).toContain('AST query skipped');
@@ -60,7 +61,7 @@ describe('applyAstRulesToAdditions', () => {
60
61
  });
61
62
  const additions = [makeAddition('src/app.ts', 'const x = 1;', 1)];
62
63
  const events = [];
63
- const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, (event, hash, ctx) => {
64
+ const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, (event, hash, ctx) => {
64
65
  events.push({ event, hash, reason: ctx?.failureReason });
65
66
  });
66
67
  expect(violations).toEqual([]);
@@ -87,7 +88,7 @@ describe('applyAstRulesToAdditions', () => {
87
88
  makeAddition('src/app.ts', 'const x = 1;', 3),
88
89
  ];
89
90
  const events = [];
90
- const violations = await applyAstRulesToAdditions([badRule, goodRule], additions, tmpDir, (event, hash) => events.push({ event, hash }));
91
+ const violations = await applyAstRulesToAdditions(ctx, [badRule, goodRule], additions, tmpDir, (event, hash) => events.push({ event, hash }));
91
92
  expect(violations).toHaveLength(1);
92
93
  expect(violations[0].rule.lessonHash).toBe('good-rule');
93
94
  expect(events.some((e) => e.event === 'failure' && e.hash === 'bad-rule')).toBe(true);
@@ -127,7 +128,7 @@ describe('applyAstRulesToAdditions', () => {
127
128
  makeAddition('src/app.ts', '} catch (err) {', 3),
128
129
  makeAddition('src/app.ts', '}', 4),
129
130
  ];
130
- const violations = await applyAstRulesToAdditions([compoundRule], additions, tmpDir);
131
+ const violations = await applyAstRulesToAdditions(ctx, [compoundRule], additions, tmpDir);
131
132
  expect(violations.length).toBeGreaterThanOrEqual(1);
132
133
  // The outer catch_clause spans lines 3-4; the first overlapping added
133
134
  // line (3) is where the violation gets reported.
@@ -144,7 +145,7 @@ describe('applyAstRulesToAdditions', () => {
144
145
  });
145
146
  const additions = [makeAddition('src/app.ts', 'const x = 1;', 1)];
146
147
  const events = [];
147
- const violations = await applyAstRulesToAdditions([compoundRule], additions, tmpDir, (event, hash, ctx) => events.push({ event, hash, reason: ctx?.failureReason }));
148
+ const violations = await applyAstRulesToAdditions(ctx, [compoundRule], additions, tmpDir, (event, hash, ctx) => events.push({ event, hash, reason: ctx?.failureReason }));
148
149
  expect(violations).toEqual([]);
149
150
  const failure = events.find((e) => e.event === 'failure');
150
151
  expect(failure).toBeDefined();
@@ -157,7 +158,7 @@ describe('applyAstRulesToAdditions', () => {
157
158
  astGrepPattern: 'console.log($$$)',
158
159
  });
159
160
  const additions = [makeAddition('src/app.ts', 'console.log("hello");', 1)];
160
- const violations = await applyAstRulesToAdditions([rule], additions, tmpDir);
161
+ const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir);
161
162
  expect(violations).toHaveLength(1);
162
163
  expect(violations[0].lineNumber).toBe(1);
163
164
  });
@@ -175,7 +176,7 @@ describe('applyAstRulesToAdditions', () => {
175
176
  return 'console.log("staged content");\n';
176
177
  return null;
177
178
  };
178
- const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, undefined, undefined, mockReadStrategy);
179
+ const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, undefined, undefined, mockReadStrategy);
179
180
  expect(violations).toHaveLength(1);
180
181
  expect(violations[0].line).toBe('console.log("staged content");');
181
182
  });
@@ -188,7 +189,7 @@ describe('applyAstRulesToAdditions', () => {
188
189
  const additions = [makeAddition('src/app.ts', 'console.log("disk content");', 1)];
189
190
  // readStrategy returns null (simulating a symlink or unreadable file)
190
191
  const mockReadStrategyReturningNull = async () => null;
191
- const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, undefined, undefined, mockReadStrategyReturningNull);
192
+ const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, undefined, undefined, mockReadStrategyReturningNull);
192
193
  expect(violations).toHaveLength(0); // Violation from disk content is ignored because readStrategy returned null
193
194
  });
194
195
  it('uses disk read when no readStrategy provided (Invariant #4 backward compat)', async () => {
@@ -199,7 +200,7 @@ describe('applyAstRulesToAdditions', () => {
199
200
  });
200
201
  const additions = [makeAddition('src/app.ts', 'console.log("disk content");', 1)];
201
202
  // No readStrategy argument passed
202
- const violations = await applyAstRulesToAdditions([rule], additions, tmpDir);
203
+ const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir);
203
204
  expect(violations).toHaveLength(1);
204
205
  expect(violations[0].line).toBe('console.log("disk content");');
205
206
  });
@@ -215,7 +216,7 @@ describe('applyAstRulesToAdditions', () => {
215
216
  });
216
217
  const additions = [makeAddition('src/app.ts', 'console.log("hello");', 1)];
217
218
  // We pass repoRoot as the workingDirectory. If it uses something else (like process.cwd()), it will fail to read the file.
218
- const violations = await applyAstRulesToAdditions([rule], additions, repoRoot);
219
+ const violations = await applyAstRulesToAdditions(ctx, [rule], additions, repoRoot);
219
220
  expect(violations).toHaveLength(1);
220
221
  });
221
222
  it('emits suppress event for ast-grep rules on totem-ignore lines', async () => {
@@ -237,7 +238,7 @@ describe('applyAstRulesToAdditions', () => {
237
238
  const onRuleEvent = (event, hash) => {
238
239
  events.push({ event, hash });
239
240
  };
240
- const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, onRuleEvent);
241
+ const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, onRuleEvent);
241
242
  expect(violations).toHaveLength(0);
242
243
  expect(events).toEqual([{ event: 'suppress', hash: 'suppress-ast-grep-test' }]);
243
244
  });
@@ -260,7 +261,7 @@ describe('applyAstRulesToAdditions', () => {
260
261
  const onRuleEvent = (event, hash) => {
261
262
  events.push({ event, hash });
262
263
  };
263
- const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, onRuleEvent);
264
+ const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, onRuleEvent);
264
265
  expect(violations).toHaveLength(0);
265
266
  expect(events).toEqual([{ event: 'suppress', hash: 'suppress-tree-sitter-test' }]);
266
267
  });
@@ -285,7 +286,7 @@ describe('applyRulesToAdditions — event context', () => {
285
286
  const onRuleEvent = (event, hash, context) => {
286
287
  events.push({ event, hash, context });
287
288
  };
288
- const violations = applyRulesToAdditions([rule], additions, onRuleEvent);
289
+ const violations = applyRulesToAdditions(ctx, [rule], additions, onRuleEvent);
289
290
  expect(violations).toHaveLength(0);
290
291
  expect(events).toHaveLength(1);
291
292
  expect(events[0].event).toBe('suppress');
@@ -320,7 +321,7 @@ describe('applyRulesToAdditions — event context', () => {
320
321
  const onRuleEvent = (event, hash, context) => {
321
322
  events.push({ event, hash, context });
322
323
  };
323
- applyRulesToAdditions([rule], additions, onRuleEvent);
324
+ applyRulesToAdditions(ctx, [rule], additions, onRuleEvent);
324
325
  expect(events).toHaveLength(1);
325
326
  expect(events[0].event).toBe('suppress');
326
327
  expect(events[0].context?.immutable).toBe(true);
@@ -343,7 +344,7 @@ describe('applyRulesToAdditions — event context', () => {
343
344
  const onRuleEvent = (event, hash, context) => {
344
345
  events.push({ event, hash, context });
345
346
  };
346
- const violations = applyRulesToAdditions([rule], additions, onRuleEvent);
347
+ const violations = applyRulesToAdditions(ctx, [rule], additions, onRuleEvent);
347
348
  expect(violations).toHaveLength(1);
348
349
  expect(events).toHaveLength(1);
349
350
  expect(events[0].event).toBe('trigger');
@@ -370,7 +371,7 @@ describe('applyRulesToAdditions — event context', () => {
370
371
  const onRuleEvent = (event, hash, context) => {
371
372
  events.push({ event, hash, context });
372
373
  };
373
- const violations = applyRulesToAdditions([rule], additions, onRuleEvent);
374
+ const violations = applyRulesToAdditions(ctx, [rule], additions, onRuleEvent);
374
375
  expect(violations).toHaveLength(0);
375
376
  expect(events).toHaveLength(1);
376
377
  expect(events[0].event).toBe('suppress');
@@ -398,7 +399,7 @@ describe('applyRulesToAdditions — event context', () => {
398
399
  const onRuleEvent = (event, hash, context) => {
399
400
  events.push({ event, hash, context });
400
401
  };
401
- const violations = applyRulesToAdditions([rule], additions, onRuleEvent);
402
+ const violations = applyRulesToAdditions(ctx, [rule], additions, onRuleEvent);
402
403
  expect(violations).toHaveLength(0);
403
404
  expect(events).toHaveLength(1);
404
405
  expect(events[0].event).toBe('suppress');
@@ -409,9 +410,6 @@ describe('applyRulesToAdditions — event context', () => {
409
410
  });
410
411
  });
411
412
  it('shield-context: legacy alias suppresses rule with deprecation warning', () => {
412
- resetShieldContextWarning();
413
- const warnings = [];
414
- setCoreLogger({ warn: (msg) => warnings.push(msg) });
415
413
  const rule = makeRule({
416
414
  engine: 'regex',
417
415
  pattern: 'console\\.log',
@@ -425,16 +423,12 @@ describe('applyRulesToAdditions — event context', () => {
425
423
  precedingLine: null,
426
424
  },
427
425
  ];
428
- const violations = applyRulesToAdditions([rule], additions);
426
+ const violations = applyRulesToAdditions(ctx, [rule], additions);
429
427
  expect(violations).toHaveLength(0);
430
- expect(warnings).toHaveLength(1);
431
- expect(warnings[0]).toContain('shield-context');
432
- resetShieldContextWarning();
428
+ expect(ctx.warnings).toHaveLength(1);
429
+ expect(ctx.warnings[0]).toContain('shield-context');
433
430
  });
434
431
  it('shield-context: on preceding line suppresses with deprecation warning', () => {
435
- resetShieldContextWarning();
436
- const warnings = [];
437
- setCoreLogger({ warn: (msg) => warnings.push(msg) });
438
432
  const rule = makeRule({
439
433
  engine: 'regex',
440
434
  pattern: 'console\\.log',
@@ -448,54 +442,91 @@ describe('applyRulesToAdditions — event context', () => {
448
442
  precedingLine: '// shield-context: legacy preceding reason',
449
443
  },
450
444
  ];
451
- const violations = applyRulesToAdditions([rule], additions);
445
+ const violations = applyRulesToAdditions(ctx, [rule], additions);
452
446
  expect(violations).toHaveLength(0);
453
- expect(warnings).toHaveLength(1);
454
- resetShieldContextWarning();
447
+ expect(ctx.warnings).toHaveLength(1);
448
+ });
449
+ it('isolates deprecation-warning state across distinct ctx instances (mmnto/totem#1441)', () => {
450
+ // Concurrency-isolation invariant: two sequential applyRulesToAdditions
451
+ // calls with distinct ctx objects each see their own one-shot deprecation
452
+ // warning. Pre-#1441, module-level `shieldContextDeprecationWarned` would
453
+ // latch after the first call and silently swallow the second.
454
+ const rule = makeRule({
455
+ engine: 'regex',
456
+ pattern: 'console\\.log',
457
+ lessonHash: 'isolation-test',
458
+ });
459
+ const additions = [
460
+ {
461
+ file: 'src/app.ts',
462
+ line: 'console.log("hi"); // shield-context: reason',
463
+ lineNumber: 1,
464
+ precedingLine: null,
465
+ },
466
+ ];
467
+ const ctxA = makeRuleEngineCtx();
468
+ const ctxB = makeRuleEngineCtx();
469
+ applyRulesToAdditions(ctxA, [rule], additions);
470
+ applyRulesToAdditions(ctxB, [rule], additions);
471
+ expect(ctxA.warnings).toHaveLength(1);
472
+ expect(ctxB.warnings).toHaveLength(1);
473
+ expect(ctxA.state.hasWarnedShieldContext).toBe(true);
474
+ expect(ctxB.state.hasWarnedShieldContext).toBe(true);
475
+ });
476
+ it('latches deprecation warning per ctx (repeat hits on same ctx warn once)', () => {
477
+ const rule = makeRule({
478
+ engine: 'regex',
479
+ pattern: 'console\\.log',
480
+ lessonHash: 'latch-test',
481
+ });
482
+ const additions = [
483
+ {
484
+ file: 'src/app.ts',
485
+ line: 'console.log("a"); // shield-context: one',
486
+ lineNumber: 1,
487
+ precedingLine: null,
488
+ },
489
+ {
490
+ file: 'src/app.ts',
491
+ line: 'console.log("b"); // shield-context: two',
492
+ lineNumber: 2,
493
+ precedingLine: null,
494
+ },
495
+ ];
496
+ applyRulesToAdditions(ctx, [rule], additions);
497
+ expect(ctx.warnings).toHaveLength(1);
455
498
  });
456
499
  });
457
500
  // ─── extractJustification ────────────────────────────
458
501
  describe('extractJustification', () => {
459
502
  it('returns empty string for plain totem-ignore', () => {
460
- expect(extractJustification('code(); // totem-ignore', null)).toBe('');
503
+ expect(extractJustification(ctx, 'code(); // totem-ignore', null)).toBe('');
461
504
  });
462
505
  it('extracts justification from same-line totem-context:', () => {
463
- expect(extractJustification('code(); // totem-context: needed for DLP', null)).toBe('needed for DLP');
506
+ expect(extractJustification(ctx, 'code(); // totem-context: needed for DLP', null)).toBe('needed for DLP');
464
507
  });
465
508
  it('extracts justification from preceding line totem-context:', () => {
466
- expect(extractJustification('code();', '// totem-context: audit trail')).toBe('audit trail');
509
+ expect(extractJustification(ctx, 'code();', '// totem-context: audit trail')).toBe('audit trail');
467
510
  });
468
511
  it('prefers same-line over preceding line', () => {
469
- expect(extractJustification('code(); // totem-context: same-line reason', '// totem-context: preceding reason')).toBe('same-line reason');
512
+ expect(extractJustification(ctx, 'code(); // totem-context: same-line reason', '// totem-context: preceding reason')).toBe('same-line reason');
470
513
  });
471
514
  it('trims whitespace from justification', () => {
472
- expect(extractJustification('code(); // totem-context: extra spaces ', null)).toBe('extra spaces');
515
+ expect(extractJustification(ctx, 'code(); // totem-context: extra spaces ', null)).toBe('extra spaces');
473
516
  });
474
517
  it('extracts justification from same-line shield-context: (legacy)', () => {
475
- resetShieldContextWarning();
476
- const warnings = [];
477
- setCoreLogger({ warn: (msg) => warnings.push(msg) });
478
- expect(extractJustification('code(); // shield-context: legacy DLP', null)).toBe('legacy DLP');
479
- expect(warnings).toHaveLength(1);
480
- resetShieldContextWarning();
518
+ expect(extractJustification(ctx, 'code(); // shield-context: legacy DLP', null)).toBe('legacy DLP');
519
+ expect(ctx.warnings).toHaveLength(1);
481
520
  });
482
521
  it('extracts justification from preceding line shield-context: (legacy)', () => {
483
- resetShieldContextWarning();
484
- const warnings = [];
485
- setCoreLogger({ warn: (msg) => warnings.push(msg) });
486
- expect(extractJustification('code();', '// shield-context: legacy audit')).toBe('legacy audit');
487
- expect(warnings).toHaveLength(1);
488
- resetShieldContextWarning();
522
+ expect(extractJustification(ctx, 'code();', '// shield-context: legacy audit')).toBe('legacy audit');
523
+ expect(ctx.warnings).toHaveLength(1);
489
524
  });
490
525
  it('prefers totem-context: over shield-context: (precedence)', () => {
491
- resetShieldContextWarning();
492
- const warnings = [];
493
- setCoreLogger({ warn: (msg) => warnings.push(msg) });
494
526
  // Same-line totem-context wins over preceding-line shield-context
495
- expect(extractJustification('code(); // totem-context: new reason', '// shield-context: old reason')).toBe('new reason');
527
+ expect(extractJustification(ctx, 'code(); // totem-context: new reason', '// shield-context: old reason')).toBe('new reason');
496
528
  // totem-context matched first — shield-context deprecation warning should NOT fire
497
- expect(warnings).toHaveLength(0);
498
- resetShieldContextWarning();
529
+ expect(ctx.warnings).toHaveLength(0);
499
530
  });
500
531
  });
501
532
  // ─── matchesGlob ──────────────────────────────────