@principles/core 1.151.0 → 1.152.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 (117) hide show
  1. package/dist/runtime-v2/__tests__/adversarial-loop.test.d.ts +2 -0
  2. package/dist/runtime-v2/__tests__/adversarial-loop.test.d.ts.map +1 -0
  3. package/dist/runtime-v2/__tests__/adversarial-loop.test.js +435 -0
  4. package/dist/runtime-v2/__tests__/adversarial-loop.test.js.map +1 -0
  5. package/dist/runtime-v2/__tests__/architecture-regression.test.js +5 -0
  6. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  7. package/dist/runtime-v2/__tests__/build-golden-trace-from-artificer.test.d.ts +2 -0
  8. package/dist/runtime-v2/__tests__/build-golden-trace-from-artificer.test.d.ts.map +1 -0
  9. package/dist/runtime-v2/__tests__/build-golden-trace-from-artificer.test.js +169 -0
  10. package/dist/runtime-v2/__tests__/build-golden-trace-from-artificer.test.js.map +1 -0
  11. package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.d.ts +2 -0
  12. package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.d.ts.map +1 -0
  13. package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js +815 -0
  14. package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js.map +1 -0
  15. package/dist/runtime-v2/__tests__/internalization-peer-runner-contracts.test.js +6 -0
  16. package/dist/runtime-v2/__tests__/internalization-peer-runner-contracts.test.js.map +1 -1
  17. package/dist/runtime-v2/__tests__/pitask-metadata.test.js +4 -0
  18. package/dist/runtime-v2/__tests__/pitask-metadata.test.js.map +1 -1
  19. package/dist/runtime-v2/adapter/__tests__/artificer-l2-adapter.test.d.ts +2 -0
  20. package/dist/runtime-v2/adapter/__tests__/artificer-l2-adapter.test.d.ts.map +1 -0
  21. package/dist/runtime-v2/adapter/__tests__/artificer-l2-adapter.test.js +510 -0
  22. package/dist/runtime-v2/adapter/__tests__/artificer-l2-adapter.test.js.map +1 -0
  23. package/dist/runtime-v2/adapter/artificer-l2-adapter.d.ts +47 -0
  24. package/dist/runtime-v2/adapter/artificer-l2-adapter.d.ts.map +1 -0
  25. package/dist/runtime-v2/adapter/artificer-l2-adapter.js +307 -0
  26. package/dist/runtime-v2/adapter/artificer-l2-adapter.js.map +1 -0
  27. package/dist/runtime-v2/adversarial-loop.d.ts +65 -0
  28. package/dist/runtime-v2/adversarial-loop.d.ts.map +1 -0
  29. package/dist/runtime-v2/adversarial-loop.js +203 -0
  30. package/dist/runtime-v2/adversarial-loop.js.map +1 -0
  31. package/dist/runtime-v2/golden-trace.d.ts +30 -0
  32. package/dist/runtime-v2/golden-trace.d.ts.map +1 -1
  33. package/dist/runtime-v2/golden-trace.js +57 -0
  34. package/dist/runtime-v2/golden-trace.js.map +1 -1
  35. package/dist/runtime-v2/index.d.ts +10 -6
  36. package/dist/runtime-v2/index.d.ts.map +1 -1
  37. package/dist/runtime-v2/index.js +7 -3
  38. package/dist/runtime-v2/index.js.map +1 -1
  39. package/dist/runtime-v2/internalization/__tests__/adversarial-case.test.d.ts +2 -0
  40. package/dist/runtime-v2/internalization/__tests__/adversarial-case.test.d.ts.map +1 -0
  41. package/dist/runtime-v2/internalization/__tests__/adversarial-case.test.js +139 -0
  42. package/dist/runtime-v2/internalization/__tests__/adversarial-case.test.js.map +1 -0
  43. package/dist/runtime-v2/internalization/__tests__/adversarial-feedback.test.d.ts +2 -0
  44. package/dist/runtime-v2/internalization/__tests__/adversarial-feedback.test.d.ts.map +1 -0
  45. package/dist/runtime-v2/internalization/__tests__/adversarial-feedback.test.js +62 -0
  46. package/dist/runtime-v2/internalization/__tests__/adversarial-feedback.test.js.map +1 -0
  47. package/dist/runtime-v2/internalization/__tests__/artificer-output-v2.test.d.ts +2 -0
  48. package/dist/runtime-v2/internalization/__tests__/artificer-output-v2.test.d.ts.map +1 -0
  49. package/dist/runtime-v2/internalization/__tests__/artificer-output-v2.test.js +249 -0
  50. package/dist/runtime-v2/internalization/__tests__/artificer-output-v2.test.js.map +1 -0
  51. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.d.ts +2 -0
  52. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.d.ts.map +1 -0
  53. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.js +24 -0
  54. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.js.map +1 -0
  55. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js +2 -2
  56. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js.map +1 -1
  57. package/dist/runtime-v2/internalization/__tests__/evaluator-output-v2.test.d.ts +2 -0
  58. package/dist/runtime-v2/internalization/__tests__/evaluator-output-v2.test.d.ts.map +1 -0
  59. package/dist/runtime-v2/internalization/__tests__/evaluator-output-v2.test.js +209 -0
  60. package/dist/runtime-v2/internalization/__tests__/evaluator-output-v2.test.js.map +1 -0
  61. package/dist/runtime-v2/internalization/__tests__/evaluator-prompt-builder-v2.test.d.ts +2 -0
  62. package/dist/runtime-v2/internalization/__tests__/evaluator-prompt-builder-v2.test.d.ts.map +1 -0
  63. package/dist/runtime-v2/internalization/__tests__/evaluator-prompt-builder-v2.test.js +125 -0
  64. package/dist/runtime-v2/internalization/__tests__/evaluator-prompt-builder-v2.test.js.map +1 -0
  65. package/dist/runtime-v2/internalization/adversarial-case.d.ts +32 -0
  66. package/dist/runtime-v2/internalization/adversarial-case.d.ts.map +1 -0
  67. package/dist/runtime-v2/internalization/adversarial-case.js +68 -0
  68. package/dist/runtime-v2/internalization/adversarial-case.js.map +1 -0
  69. package/dist/runtime-v2/internalization/adversarial-feedback.d.ts +23 -0
  70. package/dist/runtime-v2/internalization/adversarial-feedback.d.ts.map +1 -0
  71. package/dist/runtime-v2/internalization/adversarial-feedback.js +20 -0
  72. package/dist/runtime-v2/internalization/adversarial-feedback.js.map +1 -0
  73. package/dist/runtime-v2/internalization/artificer-output.d.ts +42 -0
  74. package/dist/runtime-v2/internalization/artificer-output.d.ts.map +1 -1
  75. package/dist/runtime-v2/internalization/artificer-output.js +147 -0
  76. package/dist/runtime-v2/internalization/artificer-output.js.map +1 -1
  77. package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts +10 -2
  78. package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts.map +1 -1
  79. package/dist/runtime-v2/internalization/artificer-prompt-builder.js +26 -3
  80. package/dist/runtime-v2/internalization/artificer-prompt-builder.js.map +1 -1
  81. package/dist/runtime-v2/internalization/artificer-runner.d.ts +7 -0
  82. package/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
  83. package/dist/runtime-v2/internalization/artificer-runner.js +11 -2
  84. package/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
  85. package/dist/runtime-v2/internalization/evaluator-output.d.ts +63 -0
  86. package/dist/runtime-v2/internalization/evaluator-output.d.ts.map +1 -1
  87. package/dist/runtime-v2/internalization/evaluator-output.js +158 -0
  88. package/dist/runtime-v2/internalization/evaluator-output.js.map +1 -1
  89. package/dist/runtime-v2/internalization/evaluator-prompt-builder.d.ts +8 -1
  90. package/dist/runtime-v2/internalization/evaluator-prompt-builder.d.ts.map +1 -1
  91. package/dist/runtime-v2/internalization/evaluator-prompt-builder.js +16 -3
  92. package/dist/runtime-v2/internalization/evaluator-prompt-builder.js.map +1 -1
  93. package/dist/runtime-v2/internalization/evaluator-runner.d.ts +82 -2
  94. package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
  95. package/dist/runtime-v2/internalization/evaluator-runner.js +496 -4
  96. package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  97. package/dist/runtime-v2/internalization/index.d.ts +9 -4
  98. package/dist/runtime-v2/internalization/index.d.ts.map +1 -1
  99. package/dist/runtime-v2/internalization/index.js +6 -2
  100. package/dist/runtime-v2/internalization/index.js.map +1 -1
  101. package/dist/runtime-v2/internalization/peer-runner-contracts.d.ts +2 -0
  102. package/dist/runtime-v2/internalization/peer-runner-contracts.d.ts.map +1 -1
  103. package/dist/runtime-v2/internalization/peer-runner-contracts.js +19 -9
  104. package/dist/runtime-v2/internalization/peer-runner-contracts.js.map +1 -1
  105. package/dist/runtime-v2/internalization/pitask-metadata.d.ts +7 -0
  106. package/dist/runtime-v2/internalization/pitask-metadata.d.ts.map +1 -1
  107. package/dist/runtime-v2/internalization/pitask-metadata.js +15 -5
  108. package/dist/runtime-v2/internalization/pitask-metadata.js.map +1 -1
  109. package/dist/runtime-v2/internalization/prompt-serializer.d.ts +3 -0
  110. package/dist/runtime-v2/internalization/prompt-serializer.d.ts.map +1 -0
  111. package/dist/runtime-v2/internalization/prompt-serializer.js +22 -0
  112. package/dist/runtime-v2/internalization/prompt-serializer.js.map +1 -0
  113. package/dist/telemetry-event.d.ts +2 -2
  114. package/dist/telemetry-event.d.ts.map +1 -1
  115. package/dist/telemetry-event.js +21 -0
  116. package/dist/telemetry-event.js.map +1 -1
  117. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adversarial-loop.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adversarial-loop.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/adversarial-loop.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,435 @@
1
+ /**
2
+ * runAdversarialLoop integration tests (RuleHost MVP, PRI-428).
3
+ *
4
+ * Exercises the synchronous Round 1→2 Artificer↔Evaluator loop (PRD Decision 11
5
+ * multi-round). Real ArtificerRunner + EvaluatorRunner against a real
6
+ * RuntimeStateManager + in-memory artifact store, with a controllable mock
7
+ * runtimeAdapter whose fetchOutput returns scripted outputs per round.
8
+ *
9
+ * The tricky bit: EvaluatorRunner validates that the evaluator output's
10
+ * sourceArtificerArtifactId matches the artificer artifact it resolved in
11
+ * buildContext. The artificer's artifactId is `pi-art-<taskId>-<runId>`, which
12
+ * the test cannot predict before the loop runs. So the scripted adapter uses
13
+ * FACTORIES keyed by the artificer's startRun taskId: when the evaluator fetch
14
+ * fires, the factory reads the last artificer's runId from the adapter's
15
+ * recorded calls and produces a matching evaluator output.
16
+ */
17
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
18
+ import * as os from 'node:os';
19
+ import * as path from 'node:path';
20
+ import * as fs from 'node:fs';
21
+ import { ArtificerRunner } from '../internalization/artificer-runner.js';
22
+ import { EvaluatorRunner } from '../internalization/evaluator-runner.js';
23
+ import { DefaultArtificerValidator } from '../internalization/artificer-output.js';
24
+ import { DefaultEvaluatorValidator } from '../internalization/evaluator-output.js';
25
+ import { RuntimeStateManager } from '../store/runtime-state-manager.js';
26
+ import { MemoryPIArtifactStore } from '../internalization/pi-artifact-store.js';
27
+ import { StoreEventEmitter } from '../store/event-emitter.js';
28
+ import { createPITaskDiagnosticJson } from '../internalization/pitask-metadata.js';
29
+ import { runAdversarialLoop } from '../adversarial-loop.js';
30
+ /* eslint-disable @typescript-eslint/no-non-null-assertion, @typescript-eslint/class-methods-use-this, @typescript-eslint/prefer-destructuring -- test double + guaranteed indexed lookups */
31
+ import { parsePITaskMetadata } from '../internalization/pitask-metadata.js';
32
+ const SCRIBE_TASK_ID = 'scribe-loop-001';
33
+ function isRecord(value) {
34
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
35
+ }
36
+ function requireRecord(value) {
37
+ if (!isRecord(value)) {
38
+ throw new Error('expected record fixture');
39
+ }
40
+ return value;
41
+ }
42
+ class FactoryAdapter {
43
+ artificerFactories = [];
44
+ evaluatorFactories = [];
45
+ startRunCalls = [];
46
+ /** Set by the harness so fetchOutput can resolve the REAL artificer artifactId. */
47
+ artifactStore = null;
48
+ queueArtificer(factory) { this.artificerFactories.push(factory); }
49
+ queueEvaluator(factory) { this.evaluatorFactories.push(factory); }
50
+ async lastArtificerArtifactId() {
51
+ // Artificer runs are at even startRun indices (0, 2, 4...). The most
52
+ // recent artificer call is the one preceding the current evaluator fetch.
53
+ const artificerCalls = this.startRunCalls.filter((_, idx) => idx % 2 === 0);
54
+ const last = artificerCalls[artificerCalls.length - 1];
55
+ if (!last)
56
+ throw new Error('no prior artificer run');
57
+ // The artifactStore-assigned runId differs from the RunHandle runId, so we
58
+ // read the REAL artifactId the ArtificerRunner wrote to the store.
59
+ if (this.artifactStore) {
60
+ const arts = await this.artifactStore.listBySourceTaskId(last.taskId);
61
+ if (arts.length > 0 && arts[0])
62
+ return arts[0].artifactId;
63
+ }
64
+ return `pi-art-${last.taskId}-${last.runId}`;
65
+ }
66
+ async startRun(input) {
67
+ const runId = `run-${this.startRunCalls.length}`;
68
+ this.startRunCalls.push({ taskId: input.taskRef.taskId, inputPayload: input.inputPayload, runId });
69
+ return { runId: `run-${input.taskRef.taskId}`, runtimeKind: 'test-double', startedAt: new Date().toISOString() };
70
+ }
71
+ async pollRun() { return { status: 'succeeded', runId: 'run-x' }; }
72
+ async fetchOutput() {
73
+ const idx = this.startRunCalls.length - 1;
74
+ if (idx % 2 === 0) {
75
+ const factory = this.artificerFactories.shift();
76
+ if (!factory)
77
+ throw new Error('artificer factory queue empty');
78
+ const call = this.startRunCalls[idx];
79
+ return { payload: factory(call.taskId) };
80
+ }
81
+ const factory = this.evaluatorFactories.shift();
82
+ if (!factory)
83
+ throw new Error('evaluator factory queue empty');
84
+ const call = this.startRunCalls[idx];
85
+ return { payload: factory(call.taskId, await this.lastArtificerArtifactId()) };
86
+ }
87
+ async cancelRun() { }
88
+ }
89
+ // ── Fixtures ─────────────────────────────────────────────────────────────────
90
+ function makeScribeArtifact() {
91
+ return {
92
+ artifactId: 'pi-art-scribe-loop-001',
93
+ artifactKind: 'principle',
94
+ sourceTaskId: SCRIBE_TASK_ID,
95
+ lineageArtifactIds: [],
96
+ validationStatus: 'pending',
97
+ contentJson: JSON.stringify({
98
+ taskId: SCRIBE_TASK_ID,
99
+ sourcePhilosopherArtifactId: 'pi-art-phil-loop',
100
+ principleDraft: {
101
+ title: 'Block system path writes',
102
+ statement: 'Writes to /etc and other system directories must be blocked.',
103
+ },
104
+ sourceTrace: { philosopherArtifactId: 'pi-art-phil-loop' },
105
+ risks: [],
106
+ generatedAt: new Date().toISOString(),
107
+ }),
108
+ createdAt: new Date().toISOString(),
109
+ updatedAt: new Date().toISOString(),
110
+ };
111
+ }
112
+ function makeArtificerV2(taskId) {
113
+ return {
114
+ taskId,
115
+ sourceScribeArtifactId: 'pi-art-scribe-loop-001',
116
+ implementationPlan: {
117
+ summary: 'Block system path writes',
118
+ targetSurface: 'rule-host-evaluator',
119
+ changes: ['Add path-prefix matcher'],
120
+ tests: ['unit test for /etc prefix'],
121
+ rolloutNotes: ['shadow mode'],
122
+ confidence: 0.85,
123
+ },
124
+ implementationCode: 'function evaluate(input, helpers) { return { decision: "block", matched: true, reason: "system path" }; }',
125
+ goldenTraceCases: [
126
+ { caseId: 'pos-1', kind: 'positive', toolName: 'write_file', params: { path: '/project/file.txt' }, expectedDecision: 'allow' },
127
+ { caseId: 'neg-1', kind: 'negative', toolName: 'write_file', params: { path: '/etc/passwd' }, expectedDecision: 'block' },
128
+ ],
129
+ affectedTools: ['write_file'],
130
+ sourceTrace: { scribeArtifactId: 'pi-art-scribe-loop-001' },
131
+ risks: [],
132
+ generatedAt: new Date().toISOString(),
133
+ };
134
+ }
135
+ function makeArtificerV1(taskId) {
136
+ return {
137
+ taskId,
138
+ sourceScribeArtifactId: 'pi-art-scribe-loop-001',
139
+ implementationPlan: {
140
+ summary: 'Plan only, no code',
141
+ targetSurface: 'docs',
142
+ changes: ['document'],
143
+ tests: [],
144
+ rolloutNotes: [],
145
+ confidence: 0.5,
146
+ },
147
+ sourceTrace: { scribeArtifactId: 'pi-art-scribe-loop-001' },
148
+ risks: [],
149
+ generatedAt: new Date().toISOString(),
150
+ };
151
+ }
152
+ function makeEvaluatorApproved(taskId, artificerArtifactId) {
153
+ return {
154
+ taskId,
155
+ sourceArtificerArtifactId: artificerArtifactId,
156
+ evaluation: { decision: 'approved', summary: 'approved', score: 0.9, strengths: [], concerns: [], requiredChanges: [] },
157
+ sourceTrace: { artificerArtifactId, scribeArtifactId: 'pi-art-scribe-loop-001' },
158
+ risks: [],
159
+ generatedAt: new Date().toISOString(),
160
+ codeReview: {
161
+ intentConsistency: { aligned: true, explanation: 'ok' },
162
+ scopePrecision: { verdict: 'precise', explanation: 'ok' },
163
+ traceCoverage: { sufficient: true, gaps: [], explanation: 'ok' },
164
+ },
165
+ adversarialCases: [
166
+ { caseId: 'adv-1', attackType: 'boundary', toolName: 'write_file', params: { path: '/etc/x' }, expectedDecision: 'block', rationale: 'boundary' },
167
+ ],
168
+ adversarialResult: { passed: true, failedCases: [] },
169
+ };
170
+ }
171
+ function makeEvaluatorNeedsRevision(taskId, artificerArtifactId) {
172
+ return {
173
+ taskId,
174
+ sourceArtificerArtifactId: artificerArtifactId,
175
+ evaluation: { decision: 'needs_revision', summary: 'revision needed', score: 0.4, strengths: [], concerns: ['code gap'], requiredChanges: ['fix matcher'] },
176
+ sourceTrace: { artificerArtifactId, scribeArtifactId: 'pi-art-scribe-loop-001' },
177
+ risks: [],
178
+ generatedAt: new Date().toISOString(),
179
+ codeReview: {
180
+ intentConsistency: { aligned: true, explanation: 'ok' },
181
+ scopePrecision: { verdict: 'precise', explanation: 'ok' },
182
+ traceCoverage: { sufficient: true, gaps: [], explanation: 'ok' },
183
+ },
184
+ adversarialCases: [
185
+ { caseId: 'adv-1', attackType: 'boundary', toolName: 'write_file', params: { path: '/etc/x' }, expectedDecision: 'block', rationale: 'boundary' },
186
+ ],
187
+ adversarialResult: {
188
+ passed: false,
189
+ failedCases: [
190
+ { caseId: 'adv-1', attackType: 'boundary', actualDecision: 'allow', expectedDecision: 'block', rationale: 'code allowed /etc/x' },
191
+ ],
192
+ },
193
+ };
194
+ }
195
+ function makePassingGateDeps() {
196
+ return {
197
+ evaluateInSandbox: () => ({ success: true, failedCases: [], executionTimeMs: 1, forbiddenPatternViolations: [] }),
198
+ };
199
+ }
200
+ async function makeHarness(opts = {}) {
201
+ const tmpDir = path.join(os.tmpdir(), `pd-loop-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
202
+ fs.mkdirSync(tmpDir, { recursive: true });
203
+ const stateManager = new RuntimeStateManager({ workspaceDir: tmpDir });
204
+ await stateManager.initialize();
205
+ const artifactStore = new MemoryPIArtifactStore();
206
+ const eventEmitter = new StoreEventEmitter();
207
+ const adapter = new FactoryAdapter();
208
+ adapter.artifactStore = artifactStore;
209
+ const artificerRunner = new ArtificerRunner({ stateManager, runtimeAdapter: adapter, eventEmitter, validator: new DefaultArtificerValidator(), artifactStore }, { owner: 'loop-test', runtimeKind: 'test-double', pollIntervalMs: 5, timeoutMs: 1000 });
210
+ const evaluatorRunner = new EvaluatorRunner({ stateManager, runtimeAdapter: adapter, eventEmitter, validator: new DefaultEvaluatorValidator(), artifactStore }, { owner: 'loop-test', runtimeKind: 'test-double', pollIntervalMs: 5, timeoutMs: 1000, gateDeps: opts.gateDeps });
211
+ await stateManager.createTask({
212
+ taskId: SCRIBE_TASK_ID,
213
+ taskKind: 'scribe',
214
+ status: 'succeeded',
215
+ attemptCount: 1,
216
+ maxAttempts: 3,
217
+ resultRef: 'scribe://x',
218
+ diagnosticJson: createPITaskDiagnosticJson({
219
+ dependencyTaskIds: [],
220
+ channel: 'prompt',
221
+ timeoutMs: 1000,
222
+ inputArtifactRefs: [],
223
+ outputArtifactRefs: [{ artifactType: 'principle', ref: 'pi-art-scribe-loop-001' }],
224
+ }),
225
+ });
226
+ await artifactStore.upsertArtifact(makeScribeArtifact());
227
+ return { stateManager, artifactStore, artificerRunner, evaluatorRunner, adapter, tmpDir };
228
+ }
229
+ // ── Tests ────────────────────────────────────────────────────────────────────
230
+ describe('runAdversarialLoop (PRI-428)', () => {
231
+ let h;
232
+ beforeEach(async () => { h = await makeHarness({ gateDeps: makePassingGateDeps() }); });
233
+ afterEach(() => { try {
234
+ fs.rmSync(h.tmpDir, { recursive: true, force: true });
235
+ }
236
+ catch { /* ignore */ } });
237
+ it('Round 1 approved → 1 round, rule artifact written', async () => {
238
+ h.adapter.queueArtificer(makeArtificerV2);
239
+ h.adapter.queueEvaluator(makeEvaluatorApproved);
240
+ const result = await runAdversarialLoop({
241
+ artificerRunner: h.artificerRunner,
242
+ artifactStore: h.artifactStore,
243
+ evaluatorRunner: h.evaluatorRunner,
244
+ stateManager: h.stateManager,
245
+ scribeTaskId: SCRIBE_TASK_ID,
246
+ });
247
+ expect(result.decision).toBe('approved');
248
+ expect(result.rounds).toBe(1);
249
+ expect(result.ruleArtifactId).not.toBeNull();
250
+ });
251
+ it('does not report approved when the evaluator produced no rule artifact', async () => {
252
+ h.adapter.queueArtificer(makeArtificerV2);
253
+ h.adapter.queueEvaluator((taskId, artificerArtifactId) => ({
254
+ taskId,
255
+ sourceArtificerArtifactId: artificerArtifactId,
256
+ evaluation: { decision: 'approved', summary: 'plan only', score: 0.9, strengths: [], concerns: [], requiredChanges: [] },
257
+ sourceTrace: { artificerArtifactId },
258
+ risks: [],
259
+ generatedAt: new Date().toISOString(),
260
+ }));
261
+ const result = await runAdversarialLoop({
262
+ artificerRunner: h.artificerRunner,
263
+ artifactStore: h.artifactStore,
264
+ evaluatorRunner: h.evaluatorRunner,
265
+ stateManager: h.stateManager,
266
+ scribeTaskId: SCRIBE_TASK_ID,
267
+ });
268
+ expect(result.decision).toBe('rejected');
269
+ expect(result.ruleArtifactId).toBeNull();
270
+ expect(result.degradationReason).toContain('rule_artifact');
271
+ });
272
+ it('enforces the two-round hard cap when callers request more rounds', async () => {
273
+ for (let i = 0; i < 3; i += 1) {
274
+ h.adapter.queueArtificer(makeArtificerV2);
275
+ h.adapter.queueEvaluator(makeEvaluatorNeedsRevision);
276
+ }
277
+ const result = await runAdversarialLoop({
278
+ artificerRunner: h.artificerRunner,
279
+ artifactStore: h.artifactStore,
280
+ evaluatorRunner: h.evaluatorRunner,
281
+ stateManager: h.stateManager,
282
+ scribeTaskId: SCRIBE_TASK_ID,
283
+ maxRounds: 3,
284
+ });
285
+ expect(result.rounds).toBe(2);
286
+ expect(h.adapter.startRunCalls).toHaveLength(4);
287
+ });
288
+ it('Round 1 needs_revision + Round 2 approved → 2 rounds, rule artifact written', async () => {
289
+ h.adapter.queueArtificer(makeArtificerV2);
290
+ h.adapter.queueEvaluator(makeEvaluatorNeedsRevision);
291
+ h.adapter.queueArtificer(makeArtificerV2);
292
+ h.adapter.queueEvaluator(makeEvaluatorApproved);
293
+ const result = await runAdversarialLoop({
294
+ artificerRunner: h.artificerRunner,
295
+ artifactStore: h.artifactStore,
296
+ evaluatorRunner: h.evaluatorRunner,
297
+ stateManager: h.stateManager,
298
+ scribeTaskId: SCRIBE_TASK_ID,
299
+ });
300
+ expect(result.decision).toBe('approved');
301
+ expect(result.rounds).toBe(2);
302
+ expect(result.ruleArtifactId).not.toBeNull();
303
+ });
304
+ it('Round 1+2 both needs_revision → rejected (max rounds exhausted)', async () => {
305
+ h.adapter.queueArtificer(makeArtificerV2);
306
+ h.adapter.queueEvaluator(makeEvaluatorNeedsRevision);
307
+ h.adapter.queueArtificer(makeArtificerV2);
308
+ h.adapter.queueEvaluator(makeEvaluatorNeedsRevision);
309
+ const result = await runAdversarialLoop({
310
+ artificerRunner: h.artificerRunner,
311
+ artifactStore: h.artifactStore,
312
+ evaluatorRunner: h.evaluatorRunner,
313
+ stateManager: h.stateManager,
314
+ scribeTaskId: SCRIBE_TASK_ID,
315
+ });
316
+ expect(result.decision).toBe('rejected');
317
+ expect(result.rounds).toBe(2);
318
+ expect(result.degradationReason).toContain('round');
319
+ // Principle artifact must remain for prompt-channel fallback.
320
+ expect(result.principleArtifactId).not.toBeNull();
321
+ expect(result.ruleArtifactId).toBeNull();
322
+ });
323
+ it('Artificer L2 degraded to V1 → rejected, skip code review', async () => {
324
+ h.adapter.queueArtificer(makeArtificerV1);
325
+ // Evaluator still runs (V1 path) but should not write a rule artifact.
326
+ h.adapter.queueEvaluator((taskId, artificerArtifactId) => ({
327
+ taskId,
328
+ sourceArtificerArtifactId: artificerArtifactId,
329
+ evaluation: { decision: 'approved', summary: 'v1 plan approved', score: 0.7, strengths: [], concerns: [], requiredChanges: [] },
330
+ sourceTrace: { artificerArtifactId, scribeArtifactId: 'pi-art-scribe-loop-001' },
331
+ risks: [],
332
+ generatedAt: new Date().toISOString(),
333
+ }));
334
+ const result = await runAdversarialLoop({
335
+ artificerRunner: h.artificerRunner,
336
+ artifactStore: h.artifactStore,
337
+ evaluatorRunner: h.evaluatorRunner,
338
+ stateManager: h.stateManager,
339
+ scribeTaskId: SCRIBE_TASK_ID,
340
+ });
341
+ expect(result.decision).toBe('rejected');
342
+ expect(result.degradationReason).toContain('v1');
343
+ expect(result.ruleArtifactId).toBeNull();
344
+ });
345
+ it('adversarialFeedback from Round 1 is injected into Round 2 Artificer prompt', async () => {
346
+ h.adapter.queueArtificer(makeArtificerV2);
347
+ h.adapter.queueEvaluator(makeEvaluatorNeedsRevision);
348
+ h.adapter.queueArtificer(makeArtificerV2);
349
+ h.adapter.queueEvaluator(makeEvaluatorApproved);
350
+ await runAdversarialLoop({
351
+ artificerRunner: h.artificerRunner,
352
+ artifactStore: h.artifactStore,
353
+ evaluatorRunner: h.evaluatorRunner,
354
+ stateManager: h.stateManager,
355
+ scribeTaskId: SCRIBE_TASK_ID,
356
+ });
357
+ // startRunCalls: [artificer-r1, evaluator-r1, artificer-r2, evaluator-r2]
358
+ // Round-2 artificer is index 2.
359
+ const round2ArtificerCall = h.adapter.startRunCalls[2];
360
+ const round2Payload = round2ArtificerCall.inputPayload;
361
+ expect(round2ArtificerCall).toBeDefined();
362
+ const promptStr = typeof round2ArtificerCall.inputPayload === 'string'
363
+ ? round2ArtificerCall.inputPayload
364
+ : JSON.stringify(round2ArtificerCall.inputPayload);
365
+ // The feedback must reference the Round-1 failed case.
366
+ expect(promptStr).toContain('adv-1');
367
+ // Round-1 artificer (index 0) must NOT carry the structured feedback
368
+ // field. (The protocol instruction text always mentions `adversarialFeedback`
369
+ // by name; check the parsed JSON field, not the raw substring.)
370
+ const round1ArtificerCall = h.adapter.startRunCalls[0];
371
+ const round1Payload = round1ArtificerCall.inputPayload;
372
+ const round1Parsed = requireRecord(typeof round1Payload === 'string'
373
+ ? JSON.parse(round1Payload)
374
+ : round1Payload);
375
+ expect(Object.hasOwn(round1Parsed, 'adversarialFeedback')).toBe(false);
376
+ // Round-2 artificer MUST carry the structured field.
377
+ const round2Parsed = requireRecord(typeof round2Payload === 'string'
378
+ ? JSON.parse(round2Payload)
379
+ : round2Payload);
380
+ expect(Object.hasOwn(round2Parsed, 'adversarialFeedback')).toBe(true);
381
+ });
382
+ it('adversarialFeedback is stored on the Round-2 artificer task diagnosticJson', async () => {
383
+ h.adapter.queueArtificer(makeArtificerV2);
384
+ h.adapter.queueEvaluator(makeEvaluatorNeedsRevision);
385
+ h.adapter.queueArtificer(makeArtificerV2);
386
+ h.adapter.queueEvaluator(makeEvaluatorApproved);
387
+ await runAdversarialLoop({
388
+ artificerRunner: h.artificerRunner,
389
+ artifactStore: h.artifactStore,
390
+ evaluatorRunner: h.evaluatorRunner,
391
+ stateManager: h.stateManager,
392
+ scribeTaskId: SCRIBE_TASK_ID,
393
+ });
394
+ // The Round-2 artificer task is the 2nd artificer task created. Find it
395
+ // by scanning tasks for kind=artificer and reading its diagnosticJson.
396
+ const allTasks = await h.stateManager.listTasks();
397
+ const artificerTasks = allTasks.filter((t) => t.taskKind === 'artificer');
398
+ expect(artificerTasks.length).toBe(2);
399
+ const round2Task = artificerTasks[1];
400
+ const diagJson = typeof round2Task.diagnosticJson === 'string' ? round2Task.diagnosticJson : '';
401
+ const meta = parsePITaskMetadata(diagJson);
402
+ expect(meta?.adversarialFeedback).toBeDefined();
403
+ expect(typeof meta?.adversarialFeedback).toBe('string');
404
+ expect(meta.adversarialFeedback.length).toBeGreaterThan(0);
405
+ });
406
+ it('P1 regression: V1 degradation path does not throw when evaluator task creation fails (ERR-018 never-throws)', async () => {
407
+ h.adapter.queueArtificer(makeArtificerV1);
408
+ // Wrap the stateManager so createTask throws ONLY for the V1 evaluator
409
+ // task (taskKind='evaluator'). This exercises the previously-unguarded
410
+ // createEvaluatorTask call in the V1 branch. The loop must catch it and
411
+ // return { decision: 'rejected' } rather than throwing.
412
+ const realCreate = h.stateManager.createTask.bind(h.stateManager);
413
+ const throwingSm = {
414
+ ...h.stateManager,
415
+ createTask: async (record) => {
416
+ if (record.taskKind === 'evaluator') {
417
+ throw new Error('simulated V1 evaluator task create failure');
418
+ }
419
+ return realCreate(record);
420
+ },
421
+ };
422
+ // Must NOT throw — resolve to rejected.
423
+ const result = await runAdversarialLoop({
424
+ artificerRunner: h.artificerRunner,
425
+ artifactStore: h.artifactStore,
426
+ evaluatorRunner: h.evaluatorRunner,
427
+ stateManager: throwingSm,
428
+ scribeTaskId: SCRIBE_TASK_ID,
429
+ });
430
+ expect(result.decision).toBe('rejected');
431
+ expect(result.degradationReason).toContain('v1');
432
+ expect(result.ruleArtifactId).toBeNull();
433
+ });
434
+ });
435
+ //# sourceMappingURL=adversarial-loop.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adversarial-loop.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/adversarial-loop.test.ts"],"names":[],"mappings":"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"}
@@ -93,6 +93,11 @@ const REQUIRED_SOURCE_FILES = [
93
93
  'internalization/refiner-sandbox-wrapper.ts',
94
94
  // PRI-173
95
95
  'internalization/refiner-rulehost-gate.ts',
96
+ // RuleHost MVP Activation (PRI-421..428, ADR-0014 Amendment 2026-06-17)
97
+ 'internalization/adversarial-case.ts',
98
+ 'internalization/adversarial-feedback.ts',
99
+ 'internalization/artificer-prompt-builder.ts',
100
+ 'adversarial-loop.ts',
96
101
  // Phase 2 migration: evolution types
97
102
  'evolution/evolution-types.ts',
98
103
  'evolution/index.ts',