@principles/core 1.196.0 → 1.198.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +2 -0
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts +2 -0
  4. package/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts.map +1 -0
  5. package/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js +74 -0
  6. package/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js.map +1 -0
  7. package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  8. package/dist/runtime-v2/feature-flags/feature-flag-contract.js +7 -0
  9. package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  10. package/dist/runtime-v2/index.d.ts +2 -0
  11. package/dist/runtime-v2/index.d.ts.map +1 -1
  12. package/dist/runtime-v2/index.js +1 -0
  13. package/dist/runtime-v2/index.js.map +1 -1
  14. package/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts +2 -0
  15. package/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts.map +1 -0
  16. package/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js +449 -0
  17. package/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js.map +1 -0
  18. package/dist/runtime-v2/internalization/rule-context-v2.d.ts +61 -0
  19. package/dist/runtime-v2/internalization/rule-context-v2.d.ts.map +1 -0
  20. package/dist/runtime-v2/internalization/rule-context-v2.js +301 -0
  21. package/dist/runtime-v2/internalization/rule-context-v2.js.map +1 -0
  22. package/dist/runtime-v2/internalization/rule-host-contracts.d.ts +9 -0
  23. package/dist/runtime-v2/internalization/rule-host-contracts.d.ts.map +1 -1
  24. package/package.json +1 -1
@@ -0,0 +1,449 @@
1
+ /**
2
+ * PRI-480 — Phase 1 Core ABI tests (rule-context-v2.ts)
3
+ *
4
+ * Strict TDD: this file was written BEFORE the implementation. It pins
5
+ * the public surface (types, sentinel, canonicalize, validators,
6
+ * computeBehaviorFacts) and the critical invariants from spec §4 +
7
+ * the ticket acceptance criteria (sections B–D, G).
8
+ *
9
+ * ERR coverage:
10
+ * - ERR-001 (unknown validation): every validator is fed hostile
11
+ * primitives (null, arrays, wrong types) and must reject them.
12
+ * - ERR-076 (structural validation): prototype-pollution keys
13
+ * (__proto__, constructor, prototype) are rejected by structure,
14
+ * independent of the host realm's prototype.
15
+ * - ERR-024 (real consumption): validators are exercised directly,
16
+ * not through a wrapper that hides failures.
17
+ */
18
+ import { describe, it, expect } from 'vitest';
19
+ import { canonicalizeToolKind, validateRuleToolCallRecord, validateRuleHistoryWindow, validateRuleBehaviorFacts, validateRuleContextV2, computeBehaviorFacts, UNAVAILABLE_RULE_CONTEXT, } from '../rule-context-v2.js';
20
+ // ── helpers ───────────────────────────────────────────────────────────────
21
+ function makeCall(overrides = {}) {
22
+ return {
23
+ sequenceId: 1,
24
+ toolName: 'read',
25
+ canonicalKind: 'read',
26
+ normalizedPath: 'src/a.ts',
27
+ paramsSummary: {},
28
+ outcome: 'success',
29
+ ...overrides,
30
+ };
31
+ }
32
+ function makeAvailableWindow(calls = []) {
33
+ return {
34
+ status: 'available',
35
+ truncated: false,
36
+ calls,
37
+ };
38
+ }
39
+ // ── A. canonicalizeToolKind — 20-case static alias table (spec §4.4) ───────
40
+ describe('PRI-480 canonicalizeToolKind — static alias table', () => {
41
+ const cases = [
42
+ ['read', 'read'],
43
+ ['read_file', 'read'],
44
+ ['read_many_files', 'read'],
45
+ ['grep', 'search'],
46
+ ['grep_search', 'search'],
47
+ ['search_file_content', 'search'],
48
+ ['glob', 'search'],
49
+ ['write', 'write'],
50
+ ['write_file', 'write'],
51
+ ['edit', 'write'],
52
+ ['edit_file', 'write'],
53
+ ['replace', 'write'],
54
+ ['apply_patch', 'write'],
55
+ ['bash', 'execute'],
56
+ ['exec', 'execute'],
57
+ ['execute', 'execute'],
58
+ ['run_shell_command', 'execute'],
59
+ ['sessions_spawn', 'agent'],
60
+ ['', 'other'],
61
+ ['some_unknown_tool_xyz', 'other'],
62
+ ];
63
+ it('covers the 20 required alias/unknown cases', () => {
64
+ expect(cases).toHaveLength(20);
65
+ });
66
+ for (const [input, expected] of cases) {
67
+ it(`canonicalizeToolKind(${JSON.stringify(input)}) → '${expected}'`, () => {
68
+ expect(canonicalizeToolKind(input)).toBe(expected);
69
+ });
70
+ }
71
+ it('returns "other" for non-string inputs (ERR-001: no as bypass)', () => {
72
+ expect(canonicalizeToolKind(null)).toBe('other');
73
+ expect(canonicalizeToolKind(undefined)).toBe('other');
74
+ expect(canonicalizeToolKind(123)).toBe('other');
75
+ expect(canonicalizeToolKind({ name: 'read' })).toBe('other');
76
+ expect(canonicalizeToolKind(['read'])).toBe('other');
77
+ });
78
+ it('returns "other" for inherited Object.prototype keys (ERR-076: no inherited-key leakage from TOOL_ALIAS)', () => {
79
+ expect(canonicalizeToolKind('__proto__')).toBe('other');
80
+ expect(canonicalizeToolKind('constructor')).toBe('other');
81
+ expect(canonicalizeToolKind('toString')).toBe('other');
82
+ expect(canonicalizeToolKind('hasOwnProperty')).toBe('other');
83
+ expect(canonicalizeToolKind('valueOf')).toBe('other');
84
+ });
85
+ });
86
+ // ── B. UNAVAILABLE_RULE_CONTEXT sentinel ─────────────────────────────────
87
+ describe('PRI-480 UNAVAILABLE_RULE_CONTEXT sentinel', () => {
88
+ it('has version=2', () => {
89
+ expect(UNAVAILABLE_RULE_CONTEXT.version).toBe(2);
90
+ });
91
+ it('declares history.status="unavailable"', () => {
92
+ expect(UNAVAILABLE_RULE_CONTEXT.history.status).toBe('unavailable');
93
+ });
94
+ it('declares facts.priorReadOfTarget="unknown" (unavailable invariant)', () => {
95
+ expect(UNAVAILABLE_RULE_CONTEXT.facts.priorReadOfTarget).toBe('unknown');
96
+ });
97
+ it('nulls every fact count when history is unavailable', () => {
98
+ const f = UNAVAILABLE_RULE_CONTEXT.facts;
99
+ expect(f.readCount).toBeNull();
100
+ expect(f.writeCount).toBeNull();
101
+ expect(f.uniqueWritePathCount).toBeNull();
102
+ expect(f.sameActionBlockCount).toBeNull();
103
+ });
104
+ it('has empty calls array (no fabricated history)', () => {
105
+ expect(UNAVAILABLE_RULE_CONTEXT.history.calls).toEqual([]);
106
+ });
107
+ it('is frozen (Object.isFrozen)', () => {
108
+ expect(Object.isFrozen(UNAVAILABLE_RULE_CONTEXT)).toBe(true);
109
+ });
110
+ it('is a valid RuleContextV2 per the canonical validator (self-consistency)', () => {
111
+ const result = validateRuleContextV2(UNAVAILABLE_RULE_CONTEXT);
112
+ expect(result.valid).toBe(true);
113
+ expect(result.errors).toEqual([]);
114
+ });
115
+ });
116
+ // ── C. validateRuleToolCallRecord — ERR-001 + ERR-076 ─────────────────────
117
+ describe('PRI-480 validateRuleToolCallRecord', () => {
118
+ it('accepts a well-formed record', () => {
119
+ expect(validateRuleToolCallRecord(makeCall()).valid).toBe(true);
120
+ });
121
+ it('accepts a record with normalizedPath=null', () => {
122
+ expect(validateRuleToolCallRecord(makeCall({ normalizedPath: null })).valid).toBe(true);
123
+ });
124
+ it('rejects non-object primitives (ERR-001)', () => {
125
+ expect(validateRuleToolCallRecord(null).valid).toBe(false);
126
+ expect(validateRuleToolCallRecord('read').valid).toBe(false);
127
+ expect(validateRuleToolCallRecord(42).valid).toBe(false);
128
+ });
129
+ it('rejects arrays (ERR-001)', () => {
130
+ expect(validateRuleToolCallRecord([]).valid).toBe(false);
131
+ });
132
+ it('rejects missing sequenceId', () => {
133
+ const { sequenceId: _omit, ...rest } = makeCall();
134
+ void _omit;
135
+ expect(validateRuleToolCallRecord(rest).valid).toBe(false);
136
+ });
137
+ it('rejects non-number sequenceId', () => {
138
+ expect(validateRuleToolCallRecord(makeCall({ sequenceId: '1' })).valid).toBe(false);
139
+ });
140
+ it('rejects missing toolName', () => {
141
+ const { toolName: _omit, ...rest } = makeCall();
142
+ void _omit;
143
+ expect(validateRuleToolCallRecord(rest).valid).toBe(false);
144
+ });
145
+ it('rejects empty-string toolName', () => {
146
+ expect(validateRuleToolCallRecord(makeCall({ toolName: '' })).valid).toBe(false);
147
+ });
148
+ it('rejects invalid canonicalKind enum', () => {
149
+ expect(validateRuleToolCallRecord(makeCall({ canonicalKind: 'fetch' })).valid).toBe(false);
150
+ });
151
+ it('rejects non-object normalizedPath', () => {
152
+ expect(validateRuleToolCallRecord(makeCall({ normalizedPath: 42 })).valid).toBe(false);
153
+ });
154
+ it('rejects paramsSummary that is not a plain object', () => {
155
+ expect(validateRuleToolCallRecord(makeCall({ paramsSummary: [] })).valid).toBe(false);
156
+ expect(validateRuleToolCallRecord(makeCall({ paramsSummary: null })).valid).toBe(false);
157
+ });
158
+ it('rejects invalid outcome enum', () => {
159
+ expect(validateRuleToolCallRecord(makeCall({ outcome: 'pending' })).valid).toBe(false);
160
+ });
161
+ it.each(['__proto__', 'constructor', 'prototype'])('rejects prototype-pollution own key %s (ERR-076)', (key) => {
162
+ const hostile = makeCall();
163
+ Object.defineProperty(hostile, key, {
164
+ value: 42,
165
+ enumerable: true,
166
+ configurable: true,
167
+ writable: true,
168
+ });
169
+ expect(validateRuleToolCallRecord(hostile).valid).toBe(false);
170
+ });
171
+ });
172
+ // ── D. validateRuleHistoryWindow ──────────────────────────────────────────
173
+ describe('PRI-480 validateRuleHistoryWindow', () => {
174
+ it('accepts a valid available window', () => {
175
+ expect(validateRuleHistoryWindow(makeAvailableWindow()).valid).toBe(true);
176
+ });
177
+ it('accepts a valid unavailable window with unavailableReason', () => {
178
+ expect(validateRuleHistoryWindow({
179
+ status: 'unavailable',
180
+ unavailableReason: 'db locked',
181
+ truncated: false,
182
+ calls: [],
183
+ }).valid).toBe(true);
184
+ });
185
+ it('rejects invalid status enum', () => {
186
+ expect(validateRuleHistoryWindow({ status: 'pending', truncated: false, calls: [] })
187
+ .valid).toBe(false);
188
+ });
189
+ it('rejects non-boolean truncated', () => {
190
+ expect(validateRuleHistoryWindow({ status: 'available', truncated: 'no', calls: [] })
191
+ .valid).toBe(false);
192
+ });
193
+ it('rejects non-array calls', () => {
194
+ expect(validateRuleHistoryWindow({ status: 'available', truncated: false, calls: {} })
195
+ .valid).toBe(false);
196
+ });
197
+ it('rejects when any call element is invalid', () => {
198
+ const window = makeAvailableWindow([
199
+ makeCall(),
200
+ { sequenceId: 'bad' },
201
+ ]);
202
+ expect(validateRuleHistoryWindow(window).valid).toBe(false);
203
+ });
204
+ });
205
+ // ── E. validateRuleBehaviorFacts ──────────────────────────────────────────
206
+ describe('PRI-480 validateRuleBehaviorFacts', () => {
207
+ function makeFacts(overrides = {}) {
208
+ return {
209
+ priorReadOfTarget: 'yes',
210
+ readCount: 2,
211
+ writeCount: 1,
212
+ uniqueWritePathCount: 1,
213
+ sameActionBlockCount: 0,
214
+ ...overrides,
215
+ };
216
+ }
217
+ it('accepts well-formed facts', () => {
218
+ expect(validateRuleBehaviorFacts(makeFacts()).valid).toBe(true);
219
+ });
220
+ it('accepts null counts (unavailable posture)', () => {
221
+ expect(validateRuleBehaviorFacts({
222
+ priorReadOfTarget: 'unknown',
223
+ readCount: null,
224
+ writeCount: null,
225
+ uniqueWritePathCount: null,
226
+ sameActionBlockCount: null,
227
+ }).valid).toBe(true);
228
+ });
229
+ it('rejects invalid priorReadOfTarget enum', () => {
230
+ expect(validateRuleBehaviorFacts(makeFacts({ priorReadOfTarget: 'maybe' })).valid).toBe(false);
231
+ });
232
+ it('rejects non-number non-null readCount', () => {
233
+ expect(validateRuleBehaviorFacts(makeFacts({ readCount: '2' })).valid).toBe(false);
234
+ });
235
+ it('rejects NaN readCount', () => {
236
+ expect(validateRuleBehaviorFacts(makeFacts({ readCount: NaN })).valid).toBe(false);
237
+ });
238
+ it('rejects negative writeCount', () => {
239
+ expect(validateRuleBehaviorFacts(makeFacts({ writeCount: -1 })).valid).toBe(false);
240
+ });
241
+ });
242
+ // ── F. validateRuleContextV2 + unavailable invariant (acceptance C) ───────
243
+ describe('PRI-480 validateRuleContextV2 — unavailable invariant (acceptance C)', () => {
244
+ function buildContext(overrides = {}) {
245
+ return {
246
+ version: 2,
247
+ history: {
248
+ status: 'available',
249
+ truncated: false,
250
+ calls: [],
251
+ },
252
+ facts: {
253
+ priorReadOfTarget: 'no',
254
+ readCount: 0,
255
+ writeCount: 0,
256
+ uniqueWritePathCount: 0,
257
+ sameActionBlockCount: 0,
258
+ },
259
+ ...overrides,
260
+ };
261
+ }
262
+ it('accepts a well-formed available context', () => {
263
+ expect(validateRuleContextV2(buildContext()).valid).toBe(true);
264
+ });
265
+ it('accepts the canonical unavailable posture (all counts null, priorRead=unknown)', () => {
266
+ expect(validateRuleContextV2(UNAVAILABLE_RULE_CONTEXT).valid).toBe(true);
267
+ });
268
+ it('requires version === 2', () => {
269
+ expect(validateRuleContextV2(buildContext({ version: 1 })).valid).toBe(false);
270
+ });
271
+ it('rejects when history.status=unavailable but priorReadOfTarget !== "unknown"', () => {
272
+ const ctx = buildContext({
273
+ history: { status: 'unavailable', truncated: false, calls: [] },
274
+ facts: {
275
+ priorReadOfTarget: 'no',
276
+ readCount: null,
277
+ writeCount: null,
278
+ uniqueWritePathCount: null,
279
+ sameActionBlockCount: null,
280
+ },
281
+ });
282
+ expect(validateRuleContextV2(ctx).valid).toBe(false);
283
+ });
284
+ it('rejects when history.status=unavailable but readCount is non-null', () => {
285
+ const ctx = buildContext({
286
+ history: { status: 'unavailable', truncated: false, calls: [] },
287
+ facts: {
288
+ priorReadOfTarget: 'unknown',
289
+ readCount: 3,
290
+ writeCount: null,
291
+ uniqueWritePathCount: null,
292
+ sameActionBlockCount: null,
293
+ },
294
+ });
295
+ expect(validateRuleContextV2(ctx).valid).toBe(false);
296
+ });
297
+ it('rejects when history.status=unavailable but writeCount is non-null', () => {
298
+ const ctx = buildContext({
299
+ history: { status: 'unavailable', truncated: false, calls: [] },
300
+ facts: {
301
+ priorReadOfTarget: 'unknown',
302
+ readCount: null,
303
+ writeCount: 0,
304
+ uniqueWritePathCount: null,
305
+ sameActionBlockCount: null,
306
+ },
307
+ });
308
+ expect(validateRuleContextV2(ctx).valid).toBe(false);
309
+ });
310
+ it('rejects when history.status=unavailable but sameActionBlockCount is non-null', () => {
311
+ const ctx = buildContext({
312
+ history: { status: 'unavailable', truncated: false, calls: [] },
313
+ facts: {
314
+ priorReadOfTarget: 'unknown',
315
+ readCount: null,
316
+ writeCount: null,
317
+ uniqueWritePathCount: null,
318
+ sameActionBlockCount: 0,
319
+ },
320
+ });
321
+ expect(validateRuleContextV2(ctx).valid).toBe(false);
322
+ });
323
+ it('rejects when sub-validators fail (invalid history.status)', () => {
324
+ const ctx = buildContext({
325
+ history: { status: 'broken', truncated: false, calls: [] },
326
+ });
327
+ expect(validateRuleContextV2(ctx).valid).toBe(false);
328
+ });
329
+ });
330
+ // ── G. computeBehaviorFacts — exact-match prior read + counting ──────────
331
+ describe('PRI-480 computeBehaviorFacts — acceptance D', () => {
332
+ it('returns priorReadOfTarget="yes" when a prior read hit the exact target path', () => {
333
+ const window = makeAvailableWindow([
334
+ makeCall({ canonicalKind: 'read', normalizedPath: 'src/a.ts', sequenceId: 1 }),
335
+ ]);
336
+ const facts = computeBehaviorFacts(window, 'src/a.ts', 0);
337
+ expect(facts.priorReadOfTarget).toBe('yes');
338
+ });
339
+ it('returns priorReadOfTarget="no" when target was never read', () => {
340
+ const window = makeAvailableWindow([
341
+ makeCall({ canonicalKind: 'read', normalizedPath: 'src/other.ts', sequenceId: 1 }),
342
+ ]);
343
+ const facts = computeBehaviorFacts(window, 'src/a.ts', 0);
344
+ expect(facts.priorReadOfTarget).toBe('no');
345
+ });
346
+ it('DOES NOT substring-match: src/a.ts.bak must NOT count as a read of src/a.ts', () => {
347
+ const window = makeAvailableWindow([
348
+ makeCall({ canonicalKind: 'read', normalizedPath: 'src/a.ts.bak', sequenceId: 1 }),
349
+ ]);
350
+ const facts = computeBehaviorFacts(window, 'src/a.ts', 0);
351
+ expect(facts.priorReadOfTarget).toBe('no');
352
+ });
353
+ it('DOES NOT substring-match in the other direction either (target is the longer path)', () => {
354
+ const window = makeAvailableWindow([
355
+ makeCall({ canonicalKind: 'read', normalizedPath: 'src/a.ts', sequenceId: 1 }),
356
+ ]);
357
+ const facts = computeBehaviorFacts(window, 'src/a.ts.bak', 0);
358
+ expect(facts.priorReadOfTarget).toBe('no');
359
+ });
360
+ it('does NOT count a write hit on the target path as a prior read', () => {
361
+ const window = makeAvailableWindow([
362
+ makeCall({ canonicalKind: 'write', normalizedPath: 'src/a.ts', sequenceId: 1 }),
363
+ ]);
364
+ const facts = computeBehaviorFacts(window, 'src/a.ts', 0);
365
+ expect(facts.priorReadOfTarget).toBe('no');
366
+ });
367
+ it('counts search canonicalKind as a prior read of the target path', () => {
368
+ const window = makeAvailableWindow([
369
+ makeCall({ canonicalKind: 'search', normalizedPath: 'src/a.ts', sequenceId: 1 }),
370
+ ]);
371
+ const facts = computeBehaviorFacts(window, 'src/a.ts', 0);
372
+ expect(facts.priorReadOfTarget).toBe('yes');
373
+ });
374
+ it('does NOT count execute/agent/other canonicalKind as a prior read', () => {
375
+ for (const kind of ['execute', 'agent', 'other']) {
376
+ const window = makeAvailableWindow([
377
+ makeCall({ canonicalKind: kind, normalizedPath: 'src/a.ts', sequenceId: 1 }),
378
+ ]);
379
+ const facts = computeBehaviorFacts(window, 'src/a.ts', 0);
380
+ expect(facts.priorReadOfTarget).toBe('no');
381
+ }
382
+ });
383
+ it('returns priorReadOfTarget="unknown" when targetPath is null', () => {
384
+ const window = makeAvailableWindow([
385
+ makeCall({ canonicalKind: 'read', normalizedPath: 'src/a.ts', sequenceId: 1 }),
386
+ ]);
387
+ const facts = computeBehaviorFacts(window, null, 0);
388
+ expect(facts.priorReadOfTarget).toBe('unknown');
389
+ });
390
+ it('counts readCount = number of read/search canonicalKind calls', () => {
391
+ const window = makeAvailableWindow([
392
+ makeCall({ canonicalKind: 'read', sequenceId: 1 }),
393
+ makeCall({ canonicalKind: 'search', sequenceId: 2 }),
394
+ makeCall({ canonicalKind: 'write', sequenceId: 3 }),
395
+ makeCall({ canonicalKind: 'execute', sequenceId: 4 }),
396
+ ]);
397
+ const facts = computeBehaviorFacts(window, 'src/a.ts', 0);
398
+ expect(facts.readCount).toBe(2);
399
+ });
400
+ it('counts writeCount = number of write canonicalKind calls', () => {
401
+ const window = makeAvailableWindow([
402
+ makeCall({ canonicalKind: 'write', sequenceId: 1 }),
403
+ makeCall({ canonicalKind: 'write', sequenceId: 2 }),
404
+ makeCall({ canonicalKind: 'read', sequenceId: 3 }),
405
+ ]);
406
+ const facts = computeBehaviorFacts(window, null, 0);
407
+ expect(facts.writeCount).toBe(2);
408
+ });
409
+ it('dedupes uniqueWritePathCount by normalized path', () => {
410
+ const window = makeAvailableWindow([
411
+ makeCall({ canonicalKind: 'write', normalizedPath: 'src/a.ts', sequenceId: 1 }),
412
+ makeCall({ canonicalKind: 'write', normalizedPath: 'src/a.ts', sequenceId: 2 }),
413
+ makeCall({ canonicalKind: 'write', normalizedPath: 'src/b.ts', sequenceId: 3 }),
414
+ makeCall({ canonicalKind: 'write', normalizedPath: null, sequenceId: 4 }),
415
+ ]);
416
+ const facts = computeBehaviorFacts(window, null, 0);
417
+ expect(facts.uniqueWritePathCount).toBe(2);
418
+ });
419
+ it('echoes sameActionBlockCount back unchanged', () => {
420
+ const window = makeAvailableWindow([]);
421
+ expect(computeBehaviorFacts(window, null, 0).sameActionBlockCount).toBe(0);
422
+ expect(computeBehaviorFacts(window, null, 3).sameActionBlockCount).toBe(3);
423
+ });
424
+ it('returns the all-null unavailable posture when window.status=unavailable', () => {
425
+ const window = {
426
+ status: 'unavailable',
427
+ unavailableReason: 'db locked',
428
+ truncated: false,
429
+ calls: [],
430
+ };
431
+ const facts = computeBehaviorFacts(window, 'src/a.ts', 2);
432
+ expect(facts.priorReadOfTarget).toBe('unknown');
433
+ expect(facts.readCount).toBeNull();
434
+ expect(facts.writeCount).toBeNull();
435
+ expect(facts.uniqueWritePathCount).toBeNull();
436
+ expect(facts.sameActionBlockCount).toBeNull();
437
+ });
438
+ });
439
+ // ── H. computeBehaviorFacts ignores calls with null paths for prior-read ─
440
+ describe('PRI-480 computeBehaviorFacts — null-path calls', () => {
441
+ it('does not crash and reports "no" when all reads have null paths', () => {
442
+ const window = makeAvailableWindow([
443
+ makeCall({ canonicalKind: 'read', normalizedPath: null, sequenceId: 1 }),
444
+ ]);
445
+ const facts = computeBehaviorFacts(window, 'src/a.ts', 0);
446
+ expect(facts.priorReadOfTarget).toBe('no');
447
+ });
448
+ });
449
+ //# sourceMappingURL=rule-context-v2.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-context-v2.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/rule-context-v2.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * PRI-480 — Phase 1 Core ABI (rule-context-v2.ts)
3
+ *
4
+ * Pure logic: types + canonicalize + validators + behavior-facts computation.
5
+ * Zero I/O — this module MUST NOT import node:fs / node:path / better-sqlite3 /
6
+ * any network module. The runtime-v2 architecture-regression test enforces the
7
+ * file boundary.
8
+ *
9
+ * Err-prevention:
10
+ * - ERR-001 (validate-as-unknown): every public validator takes `unknown` and
11
+ * validates structurally. No `as` bypass on parsed input.
12
+ * - ERR-076 (prototype-pollution / host-realm independence): structural checks
13
+ * use Object.keys + a PROTO_KEYS set. We never touch the host realm's
14
+ * prototype chain (no `instanceof`, no `in`).
15
+ * - rc-2: no `as` casts on parsed input.
16
+ * - rc-5: Object.hasOwn / Object.keys over the `in` operator.
17
+ *
18
+ * Spec: docs/superpowers/specs/2026-06-27-rulecode-context-vision-design.md §4.
19
+ */
20
+ export type CanonicalKind = 'read' | 'search' | 'write' | 'execute' | 'agent' | 'other';
21
+ export type EvidenceState = 'yes' | 'no' | 'unknown';
22
+ export type RuleToolOutcome = 'success' | 'failure' | 'blocked';
23
+ export type RuleHistoryStatus = 'available' | 'unavailable';
24
+ export interface RuleToolCallRecord {
25
+ sequenceId: number;
26
+ toolName: string;
27
+ canonicalKind: CanonicalKind;
28
+ normalizedPath: string | null;
29
+ paramsSummary: Record<string, unknown>;
30
+ outcome: RuleToolOutcome;
31
+ }
32
+ export interface RuleHistoryWindow {
33
+ status: RuleHistoryStatus;
34
+ unavailableReason?: string;
35
+ truncated: boolean;
36
+ calls: readonly RuleToolCallRecord[];
37
+ }
38
+ export interface RuleBehaviorFacts {
39
+ priorReadOfTarget: EvidenceState;
40
+ readCount: number | null;
41
+ writeCount: number | null;
42
+ uniqueWritePathCount: number | null;
43
+ sameActionBlockCount: number | null;
44
+ }
45
+ export interface RuleContextV2 {
46
+ version: 2;
47
+ history: RuleHistoryWindow;
48
+ facts: RuleBehaviorFacts;
49
+ }
50
+ export interface ValidationResult {
51
+ valid: boolean;
52
+ errors: string[];
53
+ }
54
+ export declare function canonicalizeToolKind(toolName: unknown): CanonicalKind;
55
+ export declare function validateRuleToolCallRecord(value: unknown): ValidationResult;
56
+ export declare function validateRuleHistoryWindow(value: unknown): ValidationResult;
57
+ export declare function validateRuleBehaviorFacts(value: unknown): ValidationResult;
58
+ export declare function validateRuleContextV2(value: unknown): ValidationResult;
59
+ export declare function computeBehaviorFacts(window: RuleHistoryWindow, targetPath: string | null, sameActionBlockCount: number | null): RuleBehaviorFacts;
60
+ export declare const UNAVAILABLE_RULE_CONTEXT: Readonly<RuleContextV2>;
61
+ //# sourceMappingURL=rule-context-v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-context-v2.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/rule-context-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAExF,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhE,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,aAAa,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,aAAa,CAAC;IACjC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AA2ED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,aAAa,CAUrE;AAID,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAiC3E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAiC1E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CA2B1E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAqDtE;AAID,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAClC,iBAAiB,CAuCnB;AAkCD,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,aAAa,CAAsB,CAAC"}