@principles/core 1.204.0 → 1.206.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 (75) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +8 -1
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +93 -0
  4. package/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
  5. package/dist/runtime-v2/activation/writers/rule-host-writer.d.ts +11 -0
  6. package/dist/runtime-v2/activation/writers/rule-host-writer.d.ts.map +1 -1
  7. package/dist/runtime-v2/activation/writers/rule-host-writer.js +22 -0
  8. package/dist/runtime-v2/activation/writers/rule-host-writer.js.map +1 -1
  9. package/dist/runtime-v2/index.d.ts +5 -3
  10. package/dist/runtime-v2/index.d.ts.map +1 -1
  11. package/dist/runtime-v2/index.js +3 -2
  12. package/dist/runtime-v2/index.js.map +1 -1
  13. package/dist/runtime-v2/intent/__tests__/intent-doc-version.test.d.ts +2 -0
  14. package/dist/runtime-v2/intent/__tests__/intent-doc-version.test.d.ts.map +1 -0
  15. package/dist/runtime-v2/intent/__tests__/intent-doc-version.test.js +88 -0
  16. package/dist/runtime-v2/intent/__tests__/intent-doc-version.test.js.map +1 -0
  17. package/dist/runtime-v2/intent/__tests__/intent-doc.test.js +27 -1
  18. package/dist/runtime-v2/intent/__tests__/intent-doc.test.js.map +1 -1
  19. package/dist/runtime-v2/intent/index.d.ts +1 -0
  20. package/dist/runtime-v2/intent/index.d.ts.map +1 -1
  21. package/dist/runtime-v2/intent/index.js +1 -0
  22. package/dist/runtime-v2/intent/index.js.map +1 -1
  23. package/dist/runtime-v2/intent/intent-doc-version.d.ts +28 -0
  24. package/dist/runtime-v2/intent/intent-doc-version.d.ts.map +1 -0
  25. package/dist/runtime-v2/intent/intent-doc-version.js +21 -0
  26. package/dist/runtime-v2/intent/intent-doc-version.js.map +1 -0
  27. package/dist/runtime-v2/intent/intent-doc.d.ts +5 -0
  28. package/dist/runtime-v2/intent/intent-doc.d.ts.map +1 -1
  29. package/dist/runtime-v2/intent/intent-doc.js +68 -0
  30. package/dist/runtime-v2/intent/intent-doc.js.map +1 -1
  31. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js +41 -1
  32. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js.map +1 -1
  33. package/dist/runtime-v2/internalization/__tests__/artificer-rule-output.test.js +130 -2
  34. package/dist/runtime-v2/internalization/__tests__/artificer-rule-output.test.js.map +1 -1
  35. package/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.d.ts +2 -0
  36. package/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.d.ts.map +1 -0
  37. package/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.js +228 -0
  38. package/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.js.map +1 -0
  39. package/dist/runtime-v2/internalization/artificer-output.d.ts +8 -0
  40. package/dist/runtime-v2/internalization/artificer-output.d.ts.map +1 -1
  41. package/dist/runtime-v2/internalization/artificer-output.js +45 -0
  42. package/dist/runtime-v2/internalization/artificer-output.js.map +1 -1
  43. package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts +2 -2
  44. package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts.map +1 -1
  45. package/dist/runtime-v2/internalization/artificer-prompt-builder.js +7 -2
  46. package/dist/runtime-v2/internalization/artificer-prompt-builder.js.map +1 -1
  47. package/dist/runtime-v2/internalization/behavior-example-pack.d.ts +66 -0
  48. package/dist/runtime-v2/internalization/behavior-example-pack.d.ts.map +1 -0
  49. package/dist/runtime-v2/internalization/behavior-example-pack.js +183 -0
  50. package/dist/runtime-v2/internalization/behavior-example-pack.js.map +1 -0
  51. package/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.d.ts +2 -0
  52. package/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.d.ts.map +1 -0
  53. package/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.js +83 -0
  54. package/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.js.map +1 -0
  55. package/dist/runtime-v2/store/intent/index.d.ts +2 -1
  56. package/dist/runtime-v2/store/intent/index.d.ts.map +1 -1
  57. package/dist/runtime-v2/store/intent/index.js +2 -1
  58. package/dist/runtime-v2/store/intent/index.js.map +1 -1
  59. package/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.d.ts +28 -0
  60. package/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.d.ts.map +1 -0
  61. package/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.js +88 -0
  62. package/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.js.map +1 -0
  63. package/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
  64. package/dist/runtime-v2/store/sqlite-connection.js +14 -0
  65. package/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
  66. package/dist/runtime-v2/tools/__tests__/artificer-l2-tool-contract.test.js +40 -1
  67. package/dist/runtime-v2/tools/__tests__/artificer-l2-tool-contract.test.js.map +1 -1
  68. package/dist/runtime-v2/tools/artificer-l2-tool-contract.d.ts.map +1 -1
  69. package/dist/runtime-v2/tools/artificer-l2-tool-contract.js +28 -1
  70. package/dist/runtime-v2/tools/artificer-l2-tool-contract.js.map +1 -1
  71. package/dist/runtime-v2/tools/artificer-output-typebox.d.ts +1 -0
  72. package/dist/runtime-v2/tools/artificer-output-typebox.d.ts.map +1 -1
  73. package/dist/runtime-v2/tools/artificer-output-typebox.js +2 -0
  74. package/dist/runtime-v2/tools/artificer-output-typebox.js.map +1 -1
  75. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=intent-doc-version.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-doc-version.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/intent/__tests__/intent-doc-version.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { computeVersionDiff, formatVersionSummary, } from '../intent-doc-version.js';
3
+ describe('computeVersionDiff', () => {
4
+ it('returns 5 section entries with changed=false for identical content', () => {
5
+ const content = '## 1. Why\nsame\n## 2. Desired Outcome\nsame\n';
6
+ const diff = computeVersionDiff(content, content);
7
+ expect(diff).toHaveLength(5);
8
+ expect(diff.every(d => d.changed === false)).toBe(true);
9
+ });
10
+ it('detects changed sections', () => {
11
+ const old = '## 1. Why\nold text\n## 2. Desired Outcome\nsame\n';
12
+ const next = '## 1. Why\nnew text\n## 2. Desired Outcome\nsame\n';
13
+ const diff = computeVersionDiff(old, next);
14
+ const whyDiff = diff.find(d => d.section === 'why');
15
+ expect(whyDiff?.changed).toBe(true);
16
+ });
17
+ it('detects unchanged sections alongside changed ones', () => {
18
+ const old = '## 1. Why\nold\n## 2. Desired Outcome\nsame content here\n';
19
+ const next = '## 1. Why\nnew\n## 2. Desired Outcome\nsame content here\n';
20
+ const diff = computeVersionDiff(old, next);
21
+ const desiredDiff = diff.find(d => d.section === 'desiredOutcome');
22
+ expect(desiredDiff?.changed).toBe(false);
23
+ });
24
+ it('treats missing section as empty string for comparison', () => {
25
+ const old = '## 1. Why\nhas content\n';
26
+ const next = '## 1. Why\nhas content\n## 2. Desired Outcome\nnew\n';
27
+ const diff = computeVersionDiff(old, next);
28
+ const desiredDiff = diff.find(d => d.section === 'desiredOutcome');
29
+ expect(desiredDiff?.changed).toBe(true);
30
+ });
31
+ });
32
+ describe('formatVersionSummary', () => {
33
+ it('formats version with index and preview', () => {
34
+ const version = {
35
+ id: 'abc-123',
36
+ lang: 'zh-CN',
37
+ contentHash: 'sha256:def',
38
+ contentSnapshot: '## 1. Why\n这是很长的内容,需要被截断到80个字符以内显示预览。',
39
+ reason: '初始创建',
40
+ createdAt: '2026-06-28T10:00:00.000Z',
41
+ };
42
+ const summary = formatVersionSummary(version, 0);
43
+ expect(summary.label).toContain('初始创建');
44
+ expect(summary.label).toContain('v1');
45
+ expect(summary.preview.length).toBeLessThanOrEqual(80);
46
+ });
47
+ it('handles missing reason with zh-CN fallback', () => {
48
+ const version = {
49
+ id: 'abc-456',
50
+ lang: 'zh-CN',
51
+ contentHash: 'sha256:ghi',
52
+ contentSnapshot: 'content',
53
+ reason: null,
54
+ createdAt: '2026-06-28T10:00:00.000Z',
55
+ };
56
+ const summary = formatVersionSummary(version, 1);
57
+ expect(summary.label).toContain('v2');
58
+ expect(summary.label).toContain('无备注');
59
+ });
60
+ it('handles missing reason with en fallback (no Chinese text)', () => {
61
+ const version = {
62
+ id: 'abc-en',
63
+ lang: 'en',
64
+ contentHash: 'sha256:en',
65
+ contentSnapshot: 'content',
66
+ reason: null,
67
+ createdAt: '2026-06-28T10:00:00.000Z',
68
+ };
69
+ const summary = formatVersionSummary(version, 0);
70
+ expect(summary.label).toContain('(no note)');
71
+ expect(summary.label).not.toContain('无备注');
72
+ });
73
+ it('truncates long previews with ellipsis', () => {
74
+ const longText = 'A'.repeat(200);
75
+ const version = {
76
+ id: 'abc-789',
77
+ lang: 'en',
78
+ contentHash: 'sha256:jkl',
79
+ contentSnapshot: longText,
80
+ reason: 'edit',
81
+ createdAt: '2026-06-28T10:00:00.000Z',
82
+ };
83
+ const summary = formatVersionSummary(version, 0);
84
+ expect(summary.preview.length).toBeLessThanOrEqual(80);
85
+ expect(summary.preview.endsWith('...')).toBe(true);
86
+ });
87
+ });
88
+ //# sourceMappingURL=intent-doc-version.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-doc-version.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/intent/__tests__/intent-doc-version.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { INTENT_MAX_BYTES, INTENT_DOC_TEMPLATE, parseIntentDocSections, computeIntentContentHash, validateIntentDocSections } from '../intent-doc.js';
2
+ import { INTENT_MAX_BYTES, INTENT_DOC_TEMPLATE, parseIntentDocSections, computeIntentContentHash, validateIntentDocSections, INTENT_DOC_TEMPLATE_ZH, INTENT_DOC_TEMPLATE_EN, getIntentFilename, createIntentTemplate } from '../intent-doc.js';
3
3
  const VALID = `# INTENT.md
4
4
 
5
5
  ## 1. Why
@@ -88,4 +88,30 @@ describe('constants', () => {
88
88
  expect(INTENT_DOC_TEMPLATE).toContain('## 5. Current Strategic Focus');
89
89
  });
90
90
  });
91
+ describe('Intent bilingual templates', () => {
92
+ it('getIntentFilename returns lang-suffixed filename', () => {
93
+ expect(getIntentFilename('zh-CN')).toBe('INTENT.zh-CN.md');
94
+ expect(getIntentFilename('en')).toBe('INTENT.en.md');
95
+ });
96
+ it('INTENT_DOC_TEMPLATE_ZH contains Chinese guidance prompts', () => {
97
+ expect(INTENT_DOC_TEMPLATE_ZH).toContain('这个项目');
98
+ expect(INTENT_DOC_TEMPLATE_ZH).toContain('## 1. Why');
99
+ });
100
+ it('INTENT_DOC_TEMPLATE_EN contains enhanced prompts', () => {
101
+ expect(INTENT_DOC_TEMPLATE_EN).toContain('Why does this project matter?');
102
+ expect(INTENT_DOC_TEMPLATE_EN).toContain('## 1. Why');
103
+ });
104
+ it('createIntentTemplate returns correct template per lang', () => {
105
+ expect(createIntentTemplate('zh-CN')).toBe(INTENT_DOC_TEMPLATE_ZH);
106
+ expect(createIntentTemplate('en')).toBe(INTENT_DOC_TEMPLATE_EN);
107
+ });
108
+ it('both templates parse to 5 sections with same keys', () => {
109
+ const zhSections = parseIntentDocSections(INTENT_DOC_TEMPLATE_ZH);
110
+ const enSections = parseIntentDocSections(INTENT_DOC_TEMPLATE_EN);
111
+ const zhKeys = Object.keys(zhSections).sort();
112
+ const enKeys = Object.keys(enSections).sort();
113
+ expect(zhKeys).toEqual(['currentStrategicFocus', 'desiredOutcome', 'nonNegotiables', 'stopEscalation', 'why']);
114
+ expect(enKeys).toEqual(zhKeys);
115
+ });
116
+ });
91
117
  //# sourceMappingURL=intent-doc.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"intent-doc.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/intent/__tests__/intent-doc.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"intent-doc.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/intent/__tests__/intent-doc.test.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,5 @@ export * from './intent-friction-block.js';
3
3
  export * from './intent-doc-reader-port.js';
4
4
  export * from './intent-decision-record.js';
5
5
  export * from './intent-patch-proposal.js';
6
+ export * from './intent-doc-version.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/intent/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/intent/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC"}
@@ -3,4 +3,5 @@ export * from './intent-friction-block.js';
3
3
  export * from './intent-doc-reader-port.js';
4
4
  export * from './intent-decision-record.js';
5
5
  export * from './intent-patch-proposal.js';
6
+ export * from './intent-doc-version.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/intent/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/intent/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type IntentLang } from './intent-doc.js';
2
+ export interface IntentDocVersion {
3
+ id: string;
4
+ lang: IntentLang;
5
+ contentHash: string;
6
+ contentSnapshot: string;
7
+ reason: string | null;
8
+ createdAt: string;
9
+ }
10
+ export interface IntentDocVersionStore {
11
+ saveVersion(input: {
12
+ lang: IntentLang;
13
+ content: string;
14
+ reason?: string;
15
+ }): Promise<IntentDocVersion>;
16
+ listVersions(lang: IntentLang, limit?: number): Promise<IntentDocVersion[]>;
17
+ getVersion(id: string): Promise<IntentDocVersion | null>;
18
+ getLatest(lang: IntentLang): Promise<IntentDocVersion | null>;
19
+ }
20
+ export declare function computeVersionDiff(oldContent: string, newContent: string): {
21
+ section: string;
22
+ changed: boolean;
23
+ }[];
24
+ export declare function formatVersionSummary(version: IntentDocVersion, index: number): {
25
+ label: string;
26
+ preview: string;
27
+ };
28
+ //# sourceMappingURL=intent-doc-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-doc-version.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/intent/intent-doc-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtG,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACzD,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;CAC/D;AAID,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,CAOzC;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,GACZ;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CASpC"}
@@ -0,0 +1,21 @@
1
+ import { parseIntentDocSections } from './intent-doc.js';
2
+ const SECTION_KEYS = ['why', 'desiredOutcome', 'nonNegotiables', 'stopEscalation', 'currentStrategicFocus'];
3
+ export function computeVersionDiff(oldContent, newContent) {
4
+ const oldSections = parseIntentDocSections(oldContent);
5
+ const newSections = parseIntentDocSections(newContent);
6
+ return SECTION_KEYS.map(key => ({
7
+ section: key,
8
+ changed: (oldSections[key] ?? '') !== (newSections[key] ?? ''),
9
+ }));
10
+ }
11
+ export function formatVersionSummary(version, index) {
12
+ const versionNumber = `v${index + 1}`;
13
+ // Language-aware fallback for missing reason (CodeRabbit review):
14
+ // English versions should not show Chinese default text.
15
+ const reason = version.reason ?? (version.lang === 'en' ? '(no note)' : '无备注');
16
+ const label = `${versionNumber} · ${reason}`;
17
+ const previewText = version.contentSnapshot.replace(/##\s*\d+\.\s*[^\n]*/g, '').trim();
18
+ const preview = previewText.length > 80 ? previewText.slice(0, 77) + '...' : previewText;
19
+ return { label, preview };
20
+ }
21
+ //# sourceMappingURL=intent-doc-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-doc-version.js","sourceRoot":"","sources":["../../../src/runtime-v2/intent/intent-doc-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAmB,MAAM,iBAAiB,CAAC;AAkB1E,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,uBAAuB,CAAU,CAAC;AAErH,MAAM,UAAU,kBAAkB,CAChC,UAAkB,EAClB,UAAkB;IAElB,MAAM,WAAW,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACvD,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;KAC/D,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAyB,EACzB,KAAa;IAEb,MAAM,aAAa,GAAG,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;IACtC,kEAAkE;IAClE,yDAAyD;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,GAAG,aAAa,MAAM,MAAM,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvF,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;IACzF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC"}
@@ -16,4 +16,9 @@ export declare function parseIntentDocSections(raw: string): IntentDocSections;
16
16
  export declare function computeIntentContentHash(raw: string): string;
17
17
  export declare function validateIntentDocSections(sections: IntentDocSections): IntentDocWarning[];
18
18
  export declare const INTENT_DOC_TEMPLATE = "# INTENT.md\n\n## 1. Why\n\nWhy does this project matter?\n\n## 2. Desired Outcome\n\nWhat observable change should happen?\n\n## 3. Non-negotiables\n\nWhat cannot be sacrificed?\n\n## 4. Stop / Escalation\n\nWhen must the Agent stop and ask?\n\n## 5. Current Strategic Focus\n\nWhat is the current strategic trade-off?\n";
19
+ export type IntentLang = 'zh-CN' | 'en';
20
+ export declare function getIntentFilename(lang: IntentLang): string;
21
+ export declare const INTENT_DOC_TEMPLATE_ZH = "# INTENT.md\n\n## 1. Why\n\n\u8FD9\u4E2A\u9879\u76EE / \u9636\u6BB5\u4E3A\u4EC0\u4E48\u91CD\u8981\uFF1F\n\u5B83\u670D\u52A1\u4E8E\u4EC0\u4E48\u957F\u671F\u76EE\u6807\uFF1F\n\u5B83\u4E0D\u53EA\u662F\u8981\u5B8C\u6210\u4EC0\u4E48\u4EFB\u52A1\uFF0C\u800C\u662F\u8981\u89E3\u51B3\u4EC0\u4E48\u771F\u5B9E\u95EE\u9898\uFF1F\n\n## 2. Desired Outcome\n\n\u5B8C\u6210\u540E\uFF0C\u4E16\u754C\u5E94\u8BE5\u53D1\u751F\u4EC0\u4E48\u53EF\u89C2\u5BDF\u7684\u53D8\u5316\uFF1F\n\u4EC0\u4E48\u7ED3\u679C\u80FD\u8BF4\u660E\u6211\u4EEC\u66F4\u63A5\u8FD1\u76EE\u6807\uFF1F\n\u907F\u514D\u5199\"\u8BA9\u4EA7\u54C1\u66F4\u597D\"\u8FD9\u79CD\u4E0D\u53EF\u6BD4\u8F83\u63CF\u8FF0\u3002\n\n## 3. Non-negotiables\n\n\u4E3A\u4E86\u8FBE\u6210\u76EE\u6807\uFF0C\u54EA\u4E9B\u4E1C\u897F\u4E0D\u80FD\u88AB\u727A\u7272\uFF1F\n\u4F8B\u5982\uFF1AOwner \u6CE8\u610F\u529B\u3001\u7528\u6237\u4FE1\u4EFB\u3001MVP \u901F\u5EA6\u3001\u5B89\u5168\u8FB9\u754C\u3001\u53EF\u7EF4\u62A4\u6027\u3001\u54C1\u724C\u8C03\u6027\u3002\n\n## 4. Stop / Escalation\n\n\u4EC0\u4E48\u60C5\u51B5\u4E0B Agent \u5FC5\u987B\u505C\u4E0B\u3001\u8BE2\u95EE\u6216\u5347\u7EA7\u7ED9 Owner\uFF1F\n\n\u6CE8\u610F\uFF1A\u8FD9\u4E9B\u662F\u8F6F\u5347\u7EA7\u6761\u4EF6\uFF1B\u9664\u975E\u53E6\u884C\u7F16\u7801\u8FDB RuleHost\uFF0C\u5426\u5219\u4E0D\u6784\u6210\u786C\u62E6\u622A\u3002\n\n## 5. Current Strategic Focus\n\n\u5F53\u524D\u9636\u6BB5\u6700\u91CD\u8981\u7684\u6218\u7565\u53D6\u820D\u662F\u4EC0\u4E48\uFF1F\n\u4F8B\u5982\uFF1A\u9A8C\u8BC1\u75DB\u70B9\u4F18\u5148\u4E8E\u67B6\u6784\u5B8C\u7F8E\uFF1B\u53D1\u5E03 MVP \u4F18\u5148\u4E8E\u529F\u80FD\u5B8C\u6574\uFF1B\u4FDD\u62A4 Owner \u6CE8\u610F\u529B\u4F18\u5148\u4E8E\u81EA\u52A8\u5316\u8986\u76D6\u7387\u3002\n";
22
+ export declare const INTENT_DOC_TEMPLATE_EN = "# INTENT.md\n\n## 1. Why\n\nWhy does this project matter?\nWhat long-term goal does it serve?\nWhat real problem does it solve \u2014 beyond just completing tasks?\n\n## 2. Desired Outcome\n\nAfter completion, what observable change should happen in the world?\nWhat result would indicate we are closer to the goal?\nAvoid non-comparable descriptions like \"make the product better\".\n\n## 3. Non-negotiables\n\nTo achieve the goal, what cannot be sacrificed?\nExamples: Owner attention, user trust, MVP speed, security boundaries, maintainability, brand voice.\n\n## 4. Stop / Escalation\n\nUnder what circumstances must the Agent stop, ask, or escalate to Owner?\n\nNote: These are soft escalation conditions; unless separately encoded into RuleHost, they do not constitute hard blocks.\n\n## 5. Current Strategic Focus\n\nWhat is the most important strategic trade-off for the current phase?\nExamples: Validating pain points over architectural perfection; Shipping MVP over feature completeness; Protecting Owner attention over automation coverage.\n";
23
+ export declare function createIntentTemplate(lang: IntentLang): string;
19
24
  //# sourceMappingURL=intent-doc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"intent-doc.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/intent/intent-doc.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,iBAAiB;IAAG,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAAE;AAC/J,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,eAAe,GAAG,WAAW,GAAG,WAAW,GAAG,cAAc,CAAC;AACpH,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAAE;AACpG,eAAO,MAAM,gBAAgB,QAAY,CAAC;AAU1C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAUrE;AACD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAA+E;AAC5I,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,gBAAgB,EAAE,CAWzF;AACD,eAAO,MAAM,mBAAmB,sUAqB/B,CAAC"}
1
+ {"version":3,"file":"intent-doc.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/intent/intent-doc.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,iBAAiB;IAAG,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAAE;AAC/J,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,eAAe,GAAG,WAAW,GAAG,WAAW,GAAG,cAAc,CAAC;AACpH,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAAE;AACpG,eAAO,MAAM,gBAAgB,QAAY,CAAC;AAU1C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAUrE;AACD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAA+E;AAC5I,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,gBAAgB,EAAE,CAWzF;AACD,eAAO,MAAM,mBAAmB,sUAqB/B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC;AAExC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAE1D;AAED,eAAO,MAAM,sBAAsB,8qDA6BlC,CAAC;AAEF,eAAO,MAAM,sBAAsB,oiCA6BlC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAG7D"}
@@ -67,4 +67,72 @@ When must the Agent stop and ask?
67
67
 
68
68
  What is the current strategic trade-off?
69
69
  `;
70
+ export function getIntentFilename(lang) {
71
+ return `INTENT.${lang}.md`;
72
+ }
73
+ export const INTENT_DOC_TEMPLATE_ZH = `# INTENT.md
74
+
75
+ ## 1. Why
76
+
77
+ 这个项目 / 阶段为什么重要?
78
+ 它服务于什么长期目标?
79
+ 它不只是要完成什么任务,而是要解决什么真实问题?
80
+
81
+ ## 2. Desired Outcome
82
+
83
+ 完成后,世界应该发生什么可观察的变化?
84
+ 什么结果能说明我们更接近目标?
85
+ 避免写"让产品更好"这种不可比较描述。
86
+
87
+ ## 3. Non-negotiables
88
+
89
+ 为了达成目标,哪些东西不能被牺牲?
90
+ 例如:Owner 注意力、用户信任、MVP 速度、安全边界、可维护性、品牌调性。
91
+
92
+ ## 4. Stop / Escalation
93
+
94
+ 什么情况下 Agent 必须停下、询问或升级给 Owner?
95
+
96
+ 注意:这些是软升级条件;除非另行编码进 RuleHost,否则不构成硬拦截。
97
+
98
+ ## 5. Current Strategic Focus
99
+
100
+ 当前阶段最重要的战略取舍是什么?
101
+ 例如:验证痛点优先于架构完美;发布 MVP 优先于功能完整;保护 Owner 注意力优先于自动化覆盖率。
102
+ `;
103
+ export const INTENT_DOC_TEMPLATE_EN = `# INTENT.md
104
+
105
+ ## 1. Why
106
+
107
+ Why does this project matter?
108
+ What long-term goal does it serve?
109
+ What real problem does it solve — beyond just completing tasks?
110
+
111
+ ## 2. Desired Outcome
112
+
113
+ After completion, what observable change should happen in the world?
114
+ What result would indicate we are closer to the goal?
115
+ Avoid non-comparable descriptions like "make the product better".
116
+
117
+ ## 3. Non-negotiables
118
+
119
+ To achieve the goal, what cannot be sacrificed?
120
+ Examples: Owner attention, user trust, MVP speed, security boundaries, maintainability, brand voice.
121
+
122
+ ## 4. Stop / Escalation
123
+
124
+ Under what circumstances must the Agent stop, ask, or escalate to Owner?
125
+
126
+ Note: These are soft escalation conditions; unless separately encoded into RuleHost, they do not constitute hard blocks.
127
+
128
+ ## 5. Current Strategic Focus
129
+
130
+ What is the most important strategic trade-off for the current phase?
131
+ Examples: Validating pain points over architectural perfection; Shipping MVP over feature completeness; Protecting Owner attention over automation coverage.
132
+ `;
133
+ export function createIntentTemplate(lang) {
134
+ if (lang === 'zh-CN')
135
+ return INTENT_DOC_TEMPLATE_ZH;
136
+ return INTENT_DOC_TEMPLATE_EN;
137
+ }
70
138
  //# sourceMappingURL=intent-doc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"intent-doc.js","sourceRoot":"","sources":["../../../src/runtime-v2/intent/intent-doc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"intent-doc.js","sourceRoot":"","sources":["../../../src/runtime-v2/intent/intent-doc.ts"],"names":[],"mappings":"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"}
@@ -35,7 +35,9 @@ describe('ArtificerPromptBuilder', () => {
35
35
  expect(promptInput.promptContractVersion).toBe(ARTIFICER_PROMPT_CONTRACT_VERSION);
36
36
  });
37
37
  it('promptContractVersion identifies the executable V2 contract', () => {
38
- expect(ARTIFICER_PROMPT_CONTRACT_VERSION).toBe('artificer-output-v2.prompt.v1');
38
+ // PRI-484 — bumped from v1 to v2 to signal the RuleCode context surface
39
+ // is part of the contract the model must obey.
40
+ expect(ARTIFICER_PROMPT_CONTRACT_VERSION).toBe('artificer-output-v2.prompt.v2');
39
41
  });
40
42
  it('instruction requires implementationSummary as a non-empty string', () => {
41
43
  expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('implementationSummary MUST be a non-empty string');
@@ -55,4 +57,42 @@ describe('ArtificerPromptBuilder', () => {
55
57
  expect(promptInput.artificerInstruction).toBe(ARTIFICER_PROTOCOL_INSTRUCTION);
56
58
  });
57
59
  });
60
+ describe('PRI-484 ARTIFICER_PROTOCOL_INSTRUCTION — v2 context section', () => {
61
+ // Red phase: assertions covering the rewrite required by the
62
+ // 2026-06-27 RuleCode context vision design §7.3.
63
+ it('allows inspecting input.context (v2 surface)', () => {
64
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toMatch(/input\.context/i);
65
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('inspect input.context');
66
+ });
67
+ it('requires allow when context is missing or unavailable', () => {
68
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('unavailable');
69
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toMatch(/MUST.*allow.*matched.*false/i);
70
+ });
71
+ it('requires preferring canonicalKind / facts over raw history.calls', () => {
72
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('facts');
73
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('canonicalKind');
74
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('Prefer');
75
+ });
76
+ it('forbids inferring "not done" from an empty calls array', () => {
77
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('not done');
78
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('empty');
79
+ });
80
+ it('declares the v2 contract version bump v1 -> v2', () => {
81
+ expect(ARTIFICER_PROMPT_CONTRACT_VERSION).toBe('artificer-output-v2.prompt.v2');
82
+ });
83
+ it('still references input.action for v1 compatibility', () => {
84
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('input.action');
85
+ });
86
+ it('mentions requiresContextVersion when declaring v2 rules', () => {
87
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('requiresContextVersion');
88
+ });
89
+ it('keeps the existing JSON-only output constraint intact', () => {
90
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('ONLY valid JSON');
91
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('no markdown');
92
+ });
93
+ it('keeps the prior adversarial-failures section intact', () => {
94
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('adversarialFeedback');
95
+ expect(ARTIFICER_PROTOCOL_INSTRUCTION).toContain('RETRY');
96
+ });
97
+ });
58
98
  //# sourceMappingURL=artificer-prompt-builder.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"artificer-prompt-builder.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artificer-prompt-builder.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.ts"],"names":[],"mappings":"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"}
@@ -133,7 +133,7 @@ describe('DefaultArtificerValidator — unified ArtificerRuleOutput (PRI-439)',
133
133
  });
134
134
  it('rejects output with more than 10 goldenTraceCases', async () => {
135
135
  const output = makeRuleOutput();
136
- const base = output.goldenTraceCases[0];
136
+ const [base] = output.goldenTraceCases;
137
137
  output.goldenTraceCases = Array.from({ length: 11 }, (_, i) => ({ ...base, caseId: `case-${i}` }));
138
138
  const result = await validator.validate(output, ARTIFICER_TASK_ID);
139
139
  expect(result.valid).toBe(false);
@@ -171,7 +171,7 @@ describe('DefaultArtificerValidator — unified ArtificerRuleOutput (PRI-439)',
171
171
  it('rejects goldenTraceCase with invalid expectedDecision enum', async () => {
172
172
  const output = makeRuleOutput();
173
173
  const cases = output.goldenTraceCases;
174
- const firstCase = cases[0];
174
+ const [firstCase] = cases;
175
175
  if (!firstCase)
176
176
  throw new Error('fixture must have at least one case');
177
177
  firstCase.expectedDecision = 'requireApproval';
@@ -245,4 +245,132 @@ describe('DefaultArtificerValidator — unified ArtificerRuleOutput (PRI-439)',
245
245
  expect(mod.ArtificerImplementationPlanSchema).toBeUndefined();
246
246
  });
247
247
  });
248
+ describe('DefaultArtificerValidator — PRI-484 requiresContextVersion + ruleContext', () => {
249
+ const validator = new DefaultArtificerValidator();
250
+ /** A valid RuleContextV2 (available history, computed facts). */
251
+ function makeValidRuleContext() {
252
+ return {
253
+ version: 2,
254
+ history: {
255
+ status: 'available',
256
+ truncated: false,
257
+ calls: [
258
+ {
259
+ sequenceId: 1,
260
+ toolName: 'read_file',
261
+ canonicalKind: 'read',
262
+ normalizedPath: '/workspace/foo.txt',
263
+ paramsSummary: { path: '/workspace/foo.txt' },
264
+ outcome: 'success',
265
+ },
266
+ ],
267
+ },
268
+ facts: {
269
+ priorReadOfTarget: 'yes',
270
+ readCount: 1,
271
+ writeCount: 0,
272
+ uniqueWritePathCount: 0,
273
+ sameActionBlockCount: 0,
274
+ },
275
+ };
276
+ }
277
+ /** Build a rule output with the given requiresContextVersion + per-case ruleContext. */
278
+ function makeOutput(opts) {
279
+ const output = {
280
+ taskId: ARTIFICER_TASK_ID,
281
+ sourceScribeArtifactId: SCRIBE_ARTIFACT_ID,
282
+ implementationCode: 'function evaluate(input, helpers) { return helpers.getToolName(input) === "edit" ? { decision: "block", matched: true, reason: "x" } : { decision: "allow", matched: false, reason: "x" }; }',
283
+ goldenTraceCases: [
284
+ {
285
+ caseId: 'negative-1',
286
+ kind: 'negative',
287
+ toolName: 'edit',
288
+ params: { path: '/etc/passwd' },
289
+ expectedDecision: 'block',
290
+ },
291
+ {
292
+ caseId: 'positive-1',
293
+ kind: 'positive',
294
+ toolName: 'read',
295
+ params: { path: '/etc/passwd' },
296
+ expectedDecision: 'allow',
297
+ },
298
+ ],
299
+ affectedTools: ['edit'],
300
+ implementationSummary: 'Block writes to system directories',
301
+ risks: [],
302
+ sourceTrace: { scribeArtifactId: SCRIBE_ARTIFACT_ID },
303
+ generatedAt: '2026-06-17T00:00:00.000Z',
304
+ };
305
+ if (opts.requiresContextVersion !== undefined) {
306
+ output.requiresContextVersion = opts.requiresContextVersion;
307
+ }
308
+ if (opts.attachRuleContextTo !== undefined) {
309
+ const cases = output.goldenTraceCases;
310
+ const target = cases[opts.attachRuleContextTo];
311
+ if (!target)
312
+ throw new Error(`invalid attachRuleContextTo index ${opts.attachRuleContextTo}`);
313
+ target.ruleContext = makeValidRuleContext();
314
+ }
315
+ return output;
316
+ }
317
+ // ── requiresContextVersion field is accepted ─────────────────────────────
318
+ it('accepts output with requiresContextVersion: 2', async () => {
319
+ const result = await validator.validate(makeOutput({ requiresContextVersion: 2 }), ARTIFICER_TASK_ID);
320
+ expect(result.valid).toBe(true);
321
+ expect(result.errors).toEqual([]);
322
+ });
323
+ it('accepts output without requiresContextVersion (v1 rule, backward compatible)', async () => {
324
+ const result = await validator.validate(makeOutput({}), ARTIFICER_TASK_ID);
325
+ expect(result.valid).toBe(true);
326
+ });
327
+ it('rejects requiresContextVersion other than 2 (only v2 is supported)', async () => {
328
+ const result = await validator.validate(makeOutput({ requiresContextVersion: 1 }), ARTIFICER_TASK_ID);
329
+ expect(result.valid).toBe(false);
330
+ expect(result.errors.some((e) => e.toLowerCase().includes('requirescontextversion'))).toBe(true);
331
+ });
332
+ it('rejects non-number requiresContextVersion', async () => {
333
+ const result = await validator.validate(makeOutput({ requiresContextVersion: '2' }), ARTIFICER_TASK_ID);
334
+ expect(result.valid).toBe(false);
335
+ expect(result.errors.some((e) => e.toLowerCase().includes('requirescontextversion'))).toBe(true);
336
+ });
337
+ // ── ruleContext on golden trace cases ────────────────────────────────────
338
+ it('accepts ruleContext on a case when requiresContextVersion: 2', async () => {
339
+ const result = await validator.validate(makeOutput({ requiresContextVersion: 2, attachRuleContextTo: 0 }), ARTIFICER_TASK_ID);
340
+ expect(result.valid).toBe(true);
341
+ });
342
+ it('rejects ruleContext on a case when requiresContextVersion is absent (v1 must not read context)', async () => {
343
+ const result = await validator.validate(makeOutput({ attachRuleContextTo: 0 }), ARTIFICER_TASK_ID);
344
+ expect(result.valid).toBe(false);
345
+ expect(result.errors.some((e) => e.toLowerCase().includes('rulecontext') || e.toLowerCase().includes('v1'))).toBe(true);
346
+ });
347
+ it('rejects malformed ruleContext when requiresContextVersion: 2 is set', async () => {
348
+ const output = makeOutput({ requiresContextVersion: 2 });
349
+ const cases = output.goldenTraceCases;
350
+ const [firstCase] = cases;
351
+ if (!firstCase)
352
+ throw new Error('fixture must have at least one case');
353
+ firstCase.ruleContext = { version: 99, history: {}, facts: {} }; // malformed
354
+ const result = await validator.validate(output, ARTIFICER_TASK_ID);
355
+ expect(result.valid).toBe(false);
356
+ expect(result.errors.some((e) => e.toLowerCase().includes('rulecontext'))).toBe(true);
357
+ });
358
+ it('rejects ruleContext with __proto__ key (prototype pollution, ERR-076)', async () => {
359
+ const output = makeOutput({ requiresContextVersion: 2 });
360
+ const cases = output.goldenTraceCases;
361
+ const [firstCase] = cases;
362
+ if (!firstCase)
363
+ throw new Error('fixture must have at least one case');
364
+ // JSON.parse is the only way to create a real own enumerable `__proto__`
365
+ // property — an object literal `{ __proto__: x }` sets the prototype chain
366
+ // instead, which Object.keys never sees. The host-realm independence guard
367
+ // (ERR-076) checks Object.keys, so we must produce the hostile shape via
368
+ // JSON to exercise the guard faithfully.
369
+ const malicious = JSON.parse('{"version":2,"history":{"status":"available","truncated":false,"calls":[]},"facts":{"priorReadOfTarget":"yes","readCount":1,"writeCount":0,"uniqueWritePathCount":0,"sameActionBlockCount":0},"__proto__":{"polluted":true}}');
370
+ firstCase.ruleContext = malicious;
371
+ const result = await validator.validate(output, ARTIFICER_TASK_ID);
372
+ expect(result.valid).toBe(false);
373
+ expect(result.errors.some((e) => e.toLowerCase().includes('rulecontext'))).toBe(true);
374
+ });
375
+ });
248
376
  //# sourceMappingURL=artificer-rule-output.test.js.map