@principles/core 1.154.0 → 1.156.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 (97) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +10 -0
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/__tests__/build-l2-principle-reader.test.d.ts +2 -0
  4. package/dist/runtime-v2/__tests__/build-l2-principle-reader.test.d.ts.map +1 -0
  5. package/dist/runtime-v2/__tests__/build-l2-principle-reader.test.js +200 -0
  6. package/dist/runtime-v2/__tests__/build-l2-principle-reader.test.js.map +1 -0
  7. package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js +16 -0
  8. package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js.map +1 -1
  9. package/dist/runtime-v2/__tests__/evaluator-runner-vslice.test.js +2 -0
  10. package/dist/runtime-v2/__tests__/evaluator-runner-vslice.test.js.map +1 -1
  11. package/dist/runtime-v2/__tests__/proven-channel-baseline.test.js +13 -0
  12. package/dist/runtime-v2/__tests__/proven-channel-baseline.test.js.map +1 -1
  13. package/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js +1 -0
  14. package/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js.map +1 -1
  15. package/dist/runtime-v2/activation/__tests__/approval-completion-service.test.d.ts +21 -0
  16. package/dist/runtime-v2/activation/__tests__/approval-completion-service.test.d.ts.map +1 -0
  17. package/dist/runtime-v2/activation/__tests__/approval-completion-service.test.js +363 -0
  18. package/dist/runtime-v2/activation/__tests__/approval-completion-service.test.js.map +1 -0
  19. package/dist/runtime-v2/activation/__tests__/approval-queue.test.js +13 -0
  20. package/dist/runtime-v2/activation/__tests__/approval-queue.test.js.map +1 -1
  21. package/dist/runtime-v2/activation/__tests__/edit-then-approve.test.d.ts +20 -0
  22. package/dist/runtime-v2/activation/__tests__/edit-then-approve.test.d.ts.map +1 -0
  23. package/dist/runtime-v2/activation/__tests__/edit-then-approve.test.js +145 -0
  24. package/dist/runtime-v2/activation/__tests__/edit-then-approve.test.js.map +1 -0
  25. package/dist/runtime-v2/activation/__tests__/production-gate-deps.test.d.ts +15 -0
  26. package/dist/runtime-v2/activation/__tests__/production-gate-deps.test.d.ts.map +1 -0
  27. package/dist/runtime-v2/activation/__tests__/production-gate-deps.test.js +249 -0
  28. package/dist/runtime-v2/activation/__tests__/production-gate-deps.test.js.map +1 -0
  29. package/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js +22 -2
  30. package/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js.map +1 -1
  31. package/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.d.ts +35 -0
  32. package/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.d.ts.map +1 -0
  33. package/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js +511 -0
  34. package/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js.map +1 -0
  35. package/dist/runtime-v2/activation/activation-dispatcher.d.ts.map +1 -1
  36. package/dist/runtime-v2/activation/activation-dispatcher.js +79 -0
  37. package/dist/runtime-v2/activation/activation-dispatcher.js.map +1 -1
  38. package/dist/runtime-v2/activation/activation-types.d.ts +48 -3
  39. package/dist/runtime-v2/activation/activation-types.d.ts.map +1 -1
  40. package/dist/runtime-v2/activation/activation-types.js +6 -0
  41. package/dist/runtime-v2/activation/activation-types.js.map +1 -1
  42. package/dist/runtime-v2/activation/approval-completion-service.d.ts +50 -0
  43. package/dist/runtime-v2/activation/approval-completion-service.d.ts.map +1 -0
  44. package/dist/runtime-v2/activation/approval-completion-service.js +160 -0
  45. package/dist/runtime-v2/activation/approval-completion-service.js.map +1 -0
  46. package/dist/runtime-v2/activation/approval-queue.d.ts +7 -1
  47. package/dist/runtime-v2/activation/approval-queue.d.ts.map +1 -1
  48. package/dist/runtime-v2/activation/approval-queue.js +14 -0
  49. package/dist/runtime-v2/activation/approval-queue.js.map +1 -1
  50. package/dist/runtime-v2/activation/index.d.ts +5 -2
  51. package/dist/runtime-v2/activation/index.d.ts.map +1 -1
  52. package/dist/runtime-v2/activation/index.js +8 -1
  53. package/dist/runtime-v2/activation/index.js.map +1 -1
  54. package/dist/runtime-v2/activation/memory-activation-state-store.d.ts +2 -2
  55. package/dist/runtime-v2/activation/memory-activation-state-store.d.ts.map +1 -1
  56. package/dist/runtime-v2/activation/memory-activation-state-store.js +4 -4
  57. package/dist/runtime-v2/activation/memory-activation-state-store.js.map +1 -1
  58. package/dist/runtime-v2/activation/memory-approval-store.d.ts +2 -1
  59. package/dist/runtime-v2/activation/memory-approval-store.d.ts.map +1 -1
  60. package/dist/runtime-v2/activation/memory-approval-store.js +18 -0
  61. package/dist/runtime-v2/activation/memory-approval-store.js.map +1 -1
  62. package/dist/runtime-v2/activation/production-gate-deps.d.ts +32 -0
  63. package/dist/runtime-v2/activation/production-gate-deps.d.ts.map +1 -0
  64. package/dist/runtime-v2/activation/production-gate-deps.js +179 -0
  65. package/dist/runtime-v2/activation/production-gate-deps.js.map +1 -0
  66. package/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts +2 -2
  67. package/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
  68. package/dist/runtime-v2/activation/sqlite-activation-state-store.js +10 -14
  69. package/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
  70. package/dist/runtime-v2/activation/sqlite-approval-store.d.ts +2 -1
  71. package/dist/runtime-v2/activation/sqlite-approval-store.d.ts.map +1 -1
  72. package/dist/runtime-v2/activation/sqlite-approval-store.js +24 -0
  73. package/dist/runtime-v2/activation/sqlite-approval-store.js.map +1 -1
  74. package/dist/runtime-v2/build-l2-principle-reader.d.ts +49 -0
  75. package/dist/runtime-v2/build-l2-principle-reader.d.ts.map +1 -0
  76. package/dist/runtime-v2/build-l2-principle-reader.js +70 -0
  77. package/dist/runtime-v2/build-l2-principle-reader.js.map +1 -0
  78. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +2 -0
  79. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  80. package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  81. package/dist/runtime-v2/feature-flags/feature-flag-contract.js +6 -0
  82. package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  83. package/dist/runtime-v2/index.d.ts +5 -3
  84. package/dist/runtime-v2/index.d.ts.map +1 -1
  85. package/dist/runtime-v2/index.js +6 -1
  86. package/dist/runtime-v2/index.js.map +1 -1
  87. package/dist/runtime-v2/internalization/evaluator-runner.d.ts +27 -0
  88. package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
  89. package/dist/runtime-v2/internalization/evaluator-runner.js +129 -2
  90. package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  91. package/dist/runtime-v2/proven-channel-baseline.d.ts.map +1 -1
  92. package/dist/runtime-v2/proven-channel-baseline.js +13 -0
  93. package/dist/runtime-v2/proven-channel-baseline.js.map +1 -1
  94. package/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
  95. package/dist/runtime-v2/store/sqlite-connection.js +12 -0
  96. package/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
  97. package/package.json +1 -1
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Edit-Then-Approve Tests — Story A (PRI-408)
3
+ *
4
+ * Tests verify the edit-then-approve flow:
5
+ * - Owner can edit a pending approval's artifact to a new version
6
+ * - Edit records actor, time, reason, previous artifactId (lineage)
7
+ * - Edit keeps status as pending (must re-approve)
8
+ * - Cannot edit an already-decided approval
9
+ * - After edit, the old artifact version must not be activatable
10
+ *
11
+ * Product Contract A: "Owner 必须能:approve;edit 后 approve;reject"
12
+ *
13
+ * ERR checklist:
14
+ * - ERR-002: Every failure path carries reason
15
+ * - ERR-004: Lineage fields (previousArtifactId) must be consistent
16
+ * - ERR-009: Required fields fail loud when missing
17
+ * - ERR-025: Production-path test
18
+ */
19
+ import { describe, it, expect } from 'vitest';
20
+ import { ApprovalQueue } from '../approval-queue.js';
21
+ import { MemoryApprovalQueueStore } from '../memory-approval-store.js';
22
+ describe('ApprovalQueue edit-then-approve', () => {
23
+ it('edits a pending approval to a new artifact version', async () => {
24
+ const store = new MemoryApprovalQueueStore();
25
+ const queue = new ApprovalQueue(store);
26
+ const created = await queue.enqueue({
27
+ artifactId: 'art-v1',
28
+ channel: 'code_tool_hook',
29
+ riskLevel: 'high',
30
+ }, '2026-06-18T00:00:00.000Z');
31
+ const editResult = await queue.edit({
32
+ approvalId: created.approvalId,
33
+ editedBy: 'owner-001',
34
+ newArtifactId: 'art-v2',
35
+ editReason: 'Refined principle text for clarity',
36
+ now: '2026-06-18T01:00:00.000Z',
37
+ });
38
+ expect(editResult.ok).toBe(true);
39
+ if (editResult.ok) {
40
+ expect(editResult.record.artifactId).toBe('art-v2');
41
+ expect(editResult.record.status).toBe('pending');
42
+ expect(editResult.record.editedAt).toBe('2026-06-18T01:00:00.000Z');
43
+ expect(editResult.record.editedBy).toBe('owner-001');
44
+ expect(editResult.record.editReason).toBe('Refined principle text for clarity');
45
+ expect(editResult.record.previousArtifactId).toBe('art-v1');
46
+ }
47
+ });
48
+ it('keeps status as pending after edit (must re-approve)', async () => {
49
+ const store = new MemoryApprovalQueueStore();
50
+ const queue = new ApprovalQueue(store);
51
+ const created = await queue.enqueue({
52
+ artifactId: 'art-v1',
53
+ channel: 'code_tool_hook',
54
+ riskLevel: 'high',
55
+ }, '2026-06-18T00:00:00.000Z');
56
+ const editResult = await queue.edit({ approvalId: created.approvalId, editedBy: 'owner-001', newArtifactId: 'art-v2', editReason: 'Fixed rule logic', now: '2026-06-18T01:00:00.000Z' });
57
+ expect(editResult.ok).toBe(true);
58
+ const found = await queue.getById(created.approvalId);
59
+ expect(found?.status).toBe('pending');
60
+ expect(found?.artifactId).toBe('art-v2');
61
+ expect(found?.decidedAt).toBeUndefined();
62
+ expect(found?.decidedBy).toBeUndefined();
63
+ });
64
+ it('allows approve after edit', async () => {
65
+ const store = new MemoryApprovalQueueStore();
66
+ const queue = new ApprovalQueue(store);
67
+ const created = await queue.enqueue({
68
+ artifactId: 'art-v1',
69
+ channel: 'code_tool_hook',
70
+ riskLevel: 'high',
71
+ }, '2026-06-18T00:00:00.000Z');
72
+ await queue.edit({ approvalId: created.approvalId, editedBy: 'owner-001', newArtifactId: 'art-v2', editReason: 'Improved', now: '2026-06-18T01:00:00.000Z' });
73
+ const approveResult = await queue.approve(created.approvalId, 'owner-001', 'Approved edited version');
74
+ expect(approveResult.ok).toBe(true);
75
+ if (approveResult.ok) {
76
+ expect(approveResult.record.status).toBe('approved');
77
+ expect(approveResult.record.artifactId).toBe('art-v2');
78
+ }
79
+ });
80
+ it('returns error when editing non-existent approval', async () => {
81
+ const store = new MemoryApprovalQueueStore();
82
+ const queue = new ApprovalQueue(store);
83
+ const result = await queue.edit({ approvalId: 'non-existent', editedBy: 'owner-001', newArtifactId: 'art-v2', editReason: 'reason', now: '2026-06-18T01:00:00.000Z' });
84
+ expect(result.ok).toBe(false);
85
+ if (!result.ok) {
86
+ expect(result.error).toBe('not_found');
87
+ }
88
+ });
89
+ it('returns error when editing an already-approved approval', async () => {
90
+ const store = new MemoryApprovalQueueStore();
91
+ const queue = new ApprovalQueue(store);
92
+ const created = await queue.enqueue({
93
+ artifactId: 'art-v1',
94
+ channel: 'code_tool_hook',
95
+ riskLevel: 'high',
96
+ }, '2026-06-18T00:00:00.000Z');
97
+ await queue.approve(created.approvalId, 'owner-001');
98
+ const editResult = await queue.edit({ approvalId: created.approvalId, editedBy: 'owner-001', newArtifactId: 'art-v2', editReason: 'Late edit', now: '2026-06-18T01:00:00.000Z' });
99
+ expect(editResult.ok).toBe(false);
100
+ if (!editResult.ok) {
101
+ expect(editResult.error).toBe('already_decided');
102
+ if (editResult.error === 'already_decided') {
103
+ expect(editResult.status).toBe('approved');
104
+ }
105
+ }
106
+ });
107
+ it('returns error when editing a rejected approval', async () => {
108
+ const store = new MemoryApprovalQueueStore();
109
+ const queue = new ApprovalQueue(store);
110
+ const created = await queue.enqueue({
111
+ artifactId: 'art-v1',
112
+ channel: 'code_tool_hook',
113
+ riskLevel: 'high',
114
+ }, '2026-06-18T00:00:00.000Z');
115
+ await queue.reject(created.approvalId, 'owner-001', 'Bad principle');
116
+ const editResult = await queue.edit({ approvalId: created.approvalId, editedBy: 'owner-001', newArtifactId: 'art-v2', editReason: 'Try again', now: '2026-06-18T01:00:00.000Z' });
117
+ expect(editResult.ok).toBe(false);
118
+ if (!editResult.ok) {
119
+ expect(editResult.error).toBe('already_decided');
120
+ if (editResult.error === 'already_decided') {
121
+ expect(editResult.status).toBe('rejected');
122
+ }
123
+ }
124
+ });
125
+ it('records lineage: previousArtifactId points to the pre-edit artifact', async () => {
126
+ const store = new MemoryApprovalQueueStore();
127
+ const queue = new ApprovalQueue(store);
128
+ const created = await queue.enqueue({
129
+ artifactId: 'art-original',
130
+ channel: 'code_tool_hook',
131
+ riskLevel: 'high',
132
+ }, '2026-06-18T00:00:00.000Z');
133
+ await queue.edit({
134
+ approvalId: created.approvalId,
135
+ editedBy: 'owner-001',
136
+ newArtifactId: 'art-edited',
137
+ editReason: 'Lineage test',
138
+ now: '2026-06-18T01:00:00.000Z',
139
+ });
140
+ const found = await queue.getById(created.approvalId);
141
+ expect(found?.previousArtifactId).toBe('art-original');
142
+ expect(found?.artifactId).toBe('art-edited');
143
+ });
144
+ });
145
+ //# sourceMappingURL=edit-then-approve.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-then-approve.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/activation/__tests__/edit-then-approve.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Production Gate Deps Factory Tests — Story A (PRI-408)
3
+ *
4
+ * Tests verify that createProductionGateDeps() returns a valid
5
+ * RefinerRuleHostGateDeps that can compile and evaluate rule code
6
+ * against golden traces using node:vm — the same compilation path
7
+ * used by the production openclaw-plugin RuleHost.
8
+ *
9
+ * ERR checklist:
10
+ * - ERR-001: Treat parsed JSON / LLM output as unknown — rule code is string-validated
11
+ * - ERR-002: Every failure path carries reason
12
+ * - ERR-025: Production-path test, not just helper
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=production-gate-deps.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"production-gate-deps.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/activation/__tests__/production-gate-deps.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Production Gate Deps Factory Tests — Story A (PRI-408)
3
+ *
4
+ * Tests verify that createProductionGateDeps() returns a valid
5
+ * RefinerRuleHostGateDeps that can compile and evaluate rule code
6
+ * against golden traces using node:vm — the same compilation path
7
+ * used by the production openclaw-plugin RuleHost.
8
+ *
9
+ * ERR checklist:
10
+ * - ERR-001: Treat parsed JSON / LLM output as unknown — rule code is string-validated
11
+ * - ERR-002: Every failure path carries reason
12
+ * - ERR-025: Production-path test, not just helper
13
+ */
14
+ import { describe, it, expect } from 'vitest';
15
+ import { createProductionGateDeps } from '../production-gate-deps.js';
16
+ import { createGoldenTraceFixture } from '../../golden-trace.js';
17
+ describe('createProductionGateDeps', () => {
18
+ it('returns a valid RefinerRuleHostGateDeps with evaluateInSandbox function', () => {
19
+ const deps = createProductionGateDeps();
20
+ expect(deps).toBeDefined();
21
+ expect(typeof deps.evaluateInSandbox).toBe('function');
22
+ });
23
+ it('compiles and evaluates valid rule code that matches golden trace expectations', () => {
24
+ const deps = createProductionGateDeps();
25
+ // Rule: block edit on system paths, allow safe paths.
26
+ // Differentiates negative/positive by checking params.filePath.
27
+ const ruleCode = `
28
+ function evaluate(input, helpers) {
29
+ var p = input.action.paramsSummary;
30
+ if (helpers.getToolName() === 'edit' && p && p.filePath === '/etc/passwd') {
31
+ return { decision: 'block', matched: true, reason: 'system path blocked' };
32
+ }
33
+ return { decision: 'allow', matched: false, reason: 'safe path' };
34
+ }
35
+ `;
36
+ const goldenTrace = createGoldenTraceFixture({
37
+ toolName: 'edit',
38
+ negativeParams: { filePath: '/etc/passwd' },
39
+ positiveParams: { filePath: '/src/index.ts' },
40
+ expectedDecision: 'block',
41
+ });
42
+ const result = deps.evaluateInSandbox(ruleCode, goldenTrace);
43
+ expect(result.success).toBe(true);
44
+ expect(result.failedCases).toHaveLength(0);
45
+ expect(result.forbiddenPatternViolations).toHaveLength(0);
46
+ });
47
+ it('detects validation failure when rule decision does not match golden trace', () => {
48
+ const deps = createProductionGateDeps();
49
+ // Rule: always allows — but golden trace expects block for negative case
50
+ const ruleCode = `
51
+ function evaluate(input, helpers) {
52
+ return { decision: 'allow', matched: false, reason: 'always allow' };
53
+ }
54
+ `;
55
+ const goldenTrace = createGoldenTraceFixture({
56
+ toolName: 'edit',
57
+ negativeParams: { filePath: '/etc/passwd' },
58
+ positiveParams: { filePath: '/src/index.ts' },
59
+ expectedDecision: 'block',
60
+ });
61
+ const result = deps.evaluateInSandbox(ruleCode, goldenTrace);
62
+ expect(result.success).toBe(false);
63
+ expect(result.failedCases.length).toBeGreaterThan(0);
64
+ // The negative case should fail because expectedDecision is 'block' but rule returns 'allow'
65
+ const negativeFailure = result.failedCases.find((c) => c.caseId === 'negative-1');
66
+ expect(negativeFailure).toBeDefined();
67
+ expect(negativeFailure?.errorType).toBe('validation_failed');
68
+ });
69
+ it('rejects code with forbidden patterns (e.g., require)', () => {
70
+ const deps = createProductionGateDeps();
71
+ const maliciousCode = `
72
+ function evaluate(input, helpers) {
73
+ const fs = require('fs');
74
+ return { decision: 'allow', matched: false, reason: 'ok' };
75
+ }
76
+ `;
77
+ const goldenTrace = createGoldenTraceFixture({
78
+ toolName: 'edit',
79
+ negativeParams: { filePath: '/etc/passwd' },
80
+ positiveParams: { filePath: '/src/index.ts' },
81
+ expectedDecision: 'block',
82
+ });
83
+ const result = deps.evaluateInSandbox(maliciousCode, goldenTrace);
84
+ expect(result.success).toBe(false);
85
+ expect(result.forbiddenPatternViolations.length).toBeGreaterThan(0);
86
+ });
87
+ it('rejects code that does not define an evaluate function', () => {
88
+ const deps = createProductionGateDeps();
89
+ const invalidCode = `
90
+ function notEvaluate(input, helpers) {
91
+ return { decision: 'allow', matched: false, reason: 'ok' };
92
+ }
93
+ `;
94
+ const goldenTrace = createGoldenTraceFixture({
95
+ toolName: 'edit',
96
+ negativeParams: { filePath: '/etc/passwd' },
97
+ positiveParams: { filePath: '/src/index.ts' },
98
+ expectedDecision: 'block',
99
+ });
100
+ const result = deps.evaluateInSandbox(invalidCode, goldenTrace);
101
+ expect(result.success).toBe(false);
102
+ expect(result.failedCases.length).toBeGreaterThan(0);
103
+ });
104
+ it('handles export function evaluate syntax (normalized by compiler)', () => {
105
+ const deps = createProductionGateDeps();
106
+ const exportCode = `
107
+ export function evaluate(input, helpers) {
108
+ var p = input.action.paramsSummary;
109
+ if (helpers.getToolName() === 'edit' && p && p.filePath === '/etc/passwd') {
110
+ return { decision: 'block', matched: true, reason: 'system path blocked' };
111
+ }
112
+ return { decision: 'allow', matched: false, reason: 'safe path' };
113
+ }
114
+ `;
115
+ const goldenTrace = createGoldenTraceFixture({
116
+ toolName: 'edit',
117
+ negativeParams: { filePath: '/etc/passwd' },
118
+ positiveParams: { filePath: '/src/index.ts' },
119
+ expectedDecision: 'block',
120
+ });
121
+ const result = deps.evaluateInSandbox(exportCode, goldenTrace);
122
+ expect(result.success).toBe(true);
123
+ expect(result.failedCases).toHaveLength(0);
124
+ });
125
+ // P2 #6 fix: vm evaluator output validation tests
126
+ describe('P2 #6: vm evaluator output validation', () => {
127
+ it('rejects invalid decision enum value (not one of allow|block|requireApproval|auto_correct)', () => {
128
+ const deps = createProductionGateDeps();
129
+ const invalidDecisionCode = `
130
+ function evaluate(input, helpers) {
131
+ return { decision: 'invalid_decision', matched: true, reason: 'bad decision' };
132
+ }
133
+ `;
134
+ const goldenTrace = createGoldenTraceFixture({
135
+ toolName: 'edit',
136
+ negativeParams: { filePath: '/etc/passwd' },
137
+ positiveParams: { filePath: '/src/index.ts' },
138
+ expectedDecision: 'block',
139
+ });
140
+ const result = deps.evaluateInSandbox(invalidDecisionCode, goldenTrace);
141
+ expect(result.success).toBe(false);
142
+ expect(result.failedCases.length).toBeGreaterThan(0);
143
+ // The invalid decision may surface as either a compile-time error or a
144
+ // per-case validation error, depending on whether the rule is evaluated
145
+ // during compilation. Either way, the result must be failure.
146
+ expect(result.success).toBe(false);
147
+ });
148
+ it('rejects result with missing matched field', () => {
149
+ const deps = createProductionGateDeps();
150
+ const missingMatchedCode = `
151
+ function evaluate(input, helpers) {
152
+ return { decision: 'allow', reason: 'missing matched' };
153
+ }
154
+ `;
155
+ const goldenTrace = createGoldenTraceFixture({
156
+ toolName: 'edit',
157
+ negativeParams: { filePath: '/etc/passwd' },
158
+ positiveParams: { filePath: '/src/index.ts' },
159
+ expectedDecision: 'block',
160
+ });
161
+ const result = deps.evaluateInSandbox(missingMatchedCode, goldenTrace);
162
+ expect(result.success).toBe(false);
163
+ });
164
+ it('rejects result with missing reason field', () => {
165
+ const deps = createProductionGateDeps();
166
+ const missingReasonCode = `
167
+ function evaluate(input, helpers) {
168
+ return { decision: 'allow', matched: false };
169
+ }
170
+ `;
171
+ const goldenTrace = createGoldenTraceFixture({
172
+ toolName: 'edit',
173
+ negativeParams: { filePath: '/etc/passwd' },
174
+ positiveParams: { filePath: '/src/index.ts' },
175
+ expectedDecision: 'block',
176
+ });
177
+ const result = deps.evaluateInSandbox(missingReasonCode, goldenTrace);
178
+ expect(result.success).toBe(false);
179
+ });
180
+ it('rejects auto_correct decision without correctionProposal', () => {
181
+ const deps = createProductionGateDeps();
182
+ const autoCorrectWithoutProposalCode = `
183
+ function evaluate(input, helpers) {
184
+ return { decision: 'auto_correct', matched: true, reason: 'auto correct without proposal' };
185
+ }
186
+ `;
187
+ const goldenTrace = createGoldenTraceFixture({
188
+ toolName: 'edit',
189
+ negativeParams: { filePath: '/etc/passwd' },
190
+ positiveParams: { filePath: '/src/index.ts' },
191
+ expectedDecision: 'block',
192
+ });
193
+ const result = deps.evaluateInSandbox(autoCorrectWithoutProposalCode, goldenTrace);
194
+ expect(result.success).toBe(false);
195
+ });
196
+ it('accepts auto_correct decision with correctionProposal present', () => {
197
+ const deps = createProductionGateDeps();
198
+ const autoCorrectWithProposalCode = `
199
+ function evaluate(input, helpers) {
200
+ return {
201
+ decision: 'auto_correct',
202
+ matched: true,
203
+ reason: 'auto correct with proposal',
204
+ correctionProposal: {
205
+ proposedParams: { filePath: '/safe/path.ts' },
206
+ correctedFields: [{ field: 'filePath', original: '/etc/passwd', proposed: '/safe/path.ts', reason: 'redirected' }],
207
+ applicationMode: 'shadow',
208
+ confidence: 0.9,
209
+ ruleId: 'rule-001',
210
+ notifyAgent: true
211
+ }
212
+ };
213
+ }
214
+ `;
215
+ const goldenTrace = createGoldenTraceFixture({
216
+ toolName: 'edit',
217
+ negativeParams: { filePath: '/etc/passwd' },
218
+ positiveParams: { filePath: '/src/index.ts' },
219
+ expectedDecision: 'block',
220
+ });
221
+ const result = deps.evaluateInSandbox(autoCorrectWithProposalCode, goldenTrace);
222
+ // The rule returns auto_correct which doesn't match expectedDecision 'block',
223
+ // so the golden trace validation will fail — but the RuleHostResult shape
224
+ // validation itself should pass (no compile error about invalid shape).
225
+ // The failure should be a validation_failed, not a compile/shape error.
226
+ expect(result.success).toBe(false);
227
+ // Verify the failure is due to decision mismatch, not invalid shape
228
+ const shapeError = result.failedCases.find(c => c.caseId === '__compile__' && c.message?.includes('invalid RuleHostResult'));
229
+ expect(shapeError).toBeUndefined();
230
+ });
231
+ it('rejects result where matched is not a boolean', () => {
232
+ const deps = createProductionGateDeps();
233
+ const wrongTypeMatchedCode = `
234
+ function evaluate(input, helpers) {
235
+ return { decision: 'allow', matched: 'yes', reason: 'matched is string not boolean' };
236
+ }
237
+ `;
238
+ const goldenTrace = createGoldenTraceFixture({
239
+ toolName: 'edit',
240
+ negativeParams: { filePath: '/etc/passwd' },
241
+ positiveParams: { filePath: '/src/index.ts' },
242
+ expectedDecision: 'block',
243
+ });
244
+ const result = deps.evaluateInSandbox(wrongTypeMatchedCode, goldenTrace);
245
+ expect(result.success).toBe(false);
246
+ });
247
+ });
248
+ });
249
+ //# sourceMappingURL=production-gate-deps.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"production-gate-deps.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/activation/__tests__/production-gate-deps.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3B,MAAM,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;QAExC,sDAAsD;QACtD,gEAAgE;QAChE,MAAM,QAAQ,GAAG;;;;;;;;CAQpB,CAAC;QAEE,MAAM,WAAW,GAAG,wBAAwB,CAAC;YAC3C,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;YAC3C,cAAc,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;YAC7C,gBAAgB,EAAE,OAAO;SAC1B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;QAExC,yEAAyE;QACzE,MAAM,QAAQ,GAAG;;;;CAIpB,CAAC;QAEE,MAAM,WAAW,GAAG,wBAAwB,CAAC;YAC3C,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;YAC3C,cAAc,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;YAC7C,gBAAgB,EAAE,OAAO;SAC1B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACrD,6FAA6F;QAC7F,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;QAClF,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;QAExC,MAAM,aAAa,GAAG;;;;;CAKzB,CAAC;QAEE,MAAM,WAAW,GAAG,wBAAwB,CAAC;YAC3C,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;YAC3C,cAAc,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;YAC7C,gBAAgB,EAAE,OAAO;SAC1B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QAElE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;QAExC,MAAM,WAAW,GAAG;;;;CAIvB,CAAC;QAEE,MAAM,WAAW,GAAG,wBAAwB,CAAC;YAC3C,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;YAC3C,cAAc,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;YAC7C,gBAAgB,EAAE,OAAO;SAC1B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEhE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;QAExC,MAAM,UAAU,GAAG;;;;;;;;CAQtB,CAAC;QAEE,MAAM,WAAW,GAAG,wBAAwB,CAAC;YAC3C,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;YAC3C,cAAc,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;YAC7C,gBAAgB,EAAE,OAAO;SAC1B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACrD,EAAE,CAAC,2FAA2F,EAAE,GAAG,EAAE;YACnG,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;YAExC,MAAM,mBAAmB,GAAG;;;;CAIjC,CAAC;YAEI,MAAM,WAAW,GAAG,wBAAwB,CAAC;gBAC3C,QAAQ,EAAE,MAAM;gBAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;gBAC3C,cAAc,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;gBAC7C,gBAAgB,EAAE,OAAO;aAC1B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;YAExE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACrD,uEAAuE;YACvE,wEAAwE;YACxE,8DAA8D;YAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;YAExC,MAAM,kBAAkB,GAAG;;;;CAIhC,CAAC;YAEI,MAAM,WAAW,GAAG,wBAAwB,CAAC;gBAC3C,QAAQ,EAAE,MAAM;gBAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;gBAC3C,cAAc,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;gBAC7C,gBAAgB,EAAE,OAAO;aAC1B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;YAEvE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;YAExC,MAAM,iBAAiB,GAAG;;;;CAI/B,CAAC;YAEI,MAAM,WAAW,GAAG,wBAAwB,CAAC;gBAC3C,QAAQ,EAAE,MAAM;gBAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;gBAC3C,cAAc,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;gBAC7C,gBAAgB,EAAE,OAAO;aAC1B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;YAEtE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;YAExC,MAAM,8BAA8B,GAAG;;;;CAI5C,CAAC;YAEI,MAAM,WAAW,GAAG,wBAAwB,CAAC;gBAC3C,QAAQ,EAAE,MAAM;gBAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;gBAC3C,cAAc,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;gBAC7C,gBAAgB,EAAE,OAAO;aAC1B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,8BAA8B,EAAE,WAAW,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;YAExC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;CAgBzC,CAAC;YAEI,MAAM,WAAW,GAAG,wBAAwB,CAAC;gBAC3C,QAAQ,EAAE,MAAM;gBAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;gBAC3C,cAAc,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;gBAC7C,gBAAgB,EAAE,OAAO;aAC1B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,2BAA2B,EAAE,WAAW,CAAC,CAAC;YAEhF,8EAA8E;YAC9E,0EAA0E;YAC1E,wEAAwE;YACxE,wEAAwE;YACxE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,oEAAoE;YACpE,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAC7H,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;YAExC,MAAM,oBAAoB,GAAG;;;;CAIlC,CAAC;YAEI,MAAM,WAAW,GAAG,wBAAwB,CAAC;gBAC3C,QAAQ,EAAE,MAAM;gBAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;gBAC3C,cAAc,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;gBAC7C,gBAAgB,EAAE,OAAO;aAC1B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;YAEzE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -75,16 +75,26 @@ describe('SqliteActivationStateStore', () => {
75
75
  });
76
76
  });
77
77
  describe('listPromptActivations', () => {
78
- it('SQL query includes deactivated_at IS NULL filter', async () => {
78
+ it('SQL query includes deactivated_at IS NULL filter by default', async () => {
79
79
  const mockAll = vi.fn().mockReturnValue([]);
80
80
  mockDb.prepare.mockReturnValue({ all: mockAll });
81
81
  const store = new SqliteActivationStateStore(mockConnection);
82
82
  await store.listPromptActivations();
83
83
  expect(mockDb.prepare).toHaveBeenCalledWith(expect.stringContaining('deactivated_at IS NULL'));
84
84
  });
85
+ it('includeDeactivated=true omits the deactivated_at IS NULL filter (P2 #5 fix)', async () => {
86
+ const mockAll = vi.fn().mockReturnValue([]);
87
+ mockDb.prepare.mockReturnValue({ all: mockAll });
88
+ const store = new SqliteActivationStateStore(mockConnection);
89
+ await store.listPromptActivations(true);
90
+ const [sqlCall] = mockDb.prepare.mock.calls;
91
+ const sql = sqlCall ? String(sqlCall) : '';
92
+ expect(sql).toContain("channel = 'prompt'");
93
+ expect(sql).not.toContain('deactivated_at IS NULL');
94
+ });
85
95
  });
86
96
  describe('listCodeToolHookActivations', () => {
87
- it('SQL query filters by code_tool_hook channel and deactivated_at IS NULL', async () => {
97
+ it('SQL query filters by code_tool_hook channel and deactivated_at IS NULL by default', async () => {
88
98
  const mockAll = vi.fn().mockReturnValue([]);
89
99
  mockDb.prepare.mockReturnValue({ all: mockAll });
90
100
  const store = new SqliteActivationStateStore(mockConnection);
@@ -92,6 +102,16 @@ describe('SqliteActivationStateStore', () => {
92
102
  expect(mockDb.prepare).toHaveBeenCalledWith(expect.stringContaining("channel = 'code_tool_hook'"));
93
103
  expect(mockDb.prepare).toHaveBeenCalledWith(expect.stringContaining('deactivated_at IS NULL'));
94
104
  });
105
+ it('includeDeactivated=true omits the deactivated_at IS NULL filter (P2 #5 fix)', async () => {
106
+ const mockAll = vi.fn().mockReturnValue([]);
107
+ mockDb.prepare.mockReturnValue({ all: mockAll });
108
+ const store = new SqliteActivationStateStore(mockConnection);
109
+ await store.listCodeToolHookActivations(true);
110
+ const [sqlCall] = mockDb.prepare.mock.calls;
111
+ const sql = sqlCall ? String(sqlCall) : '';
112
+ expect(sql).toContain("channel = 'code_tool_hook'");
113
+ expect(sql).not.toContain('deactivated_at IS NULL');
114
+ });
95
115
  it('returns mapped ActivationStatusRecord for code_tool_hook rows', async () => {
96
116
  const mockAll = vi.fn().mockReturnValue([{
97
117
  activation_id: 'act_code_001',
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-activation-state-store.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlite-activation-state-store.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Story A Acceptance Test — PRI-408
3
+ *
4
+ * UNSKIPPABLE end-to-end acceptance test for the Story A production loop:
5
+ * pain → admitted candidate → understandable principle → validated rule candidate
6
+ * → awaiting_owner_review → owner edit/approve → activation queued/completed
7
+ * → active RuleHost record → later comparable OpenClaw tool call changes behavior
8
+ * → observation evidence persisted → owner rollback
9
+ * → later comparable call no longer applies rule
10
+ *
11
+ * Uses real SQLite stores + production services + production OpenClaw hook adapter.
12
+ * No mocks of the production path. No "function was called" assertions. No
13
+ * "success or failure both pass" assertions. No narrative fixtures masquerading
14
+ * as production paths.
15
+ *
16
+ * Coverage matrix (per PRD):
17
+ * - owner reject: does not activate
18
+ * - owner edit: old version cannot activate
19
+ * - approval/artifact lineage mismatch: refused
20
+ * - duplicate approval completion: idempotent
21
+ * - feature disabled: zero side effects
22
+ * - unrelated task: not triggered
23
+ * - malformed stored JSON: fail loud
24
+ * - rollback: active reader no longer returns rule
25
+ *
26
+ * ERR checklist:
27
+ * - ERR-001: All parsed JSON treated as unknown, validated at runtime
28
+ * - ERR-002: Every failure path carries reason + nextAction
29
+ * - ERR-004/008: Lineage fields from same source, mismatch tested
30
+ * - ERR-009: Required fields fail loud
31
+ * - ERR-015: Idempotency state distinguished from current dispatch
32
+ * - ERR-025: Production-path test, not demo helper
33
+ */
34
+ export {};
35
+ //# sourceMappingURL=story-a-acceptance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-a-acceptance.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/activation/__tests__/story-a-acceptance.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG"}