@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.
- package/dist/runtime-v2/__tests__/adversarial-loop.test.d.ts +2 -0
- package/dist/runtime-v2/__tests__/adversarial-loop.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/adversarial-loop.test.js +435 -0
- package/dist/runtime-v2/__tests__/adversarial-loop.test.js.map +1 -0
- package/dist/runtime-v2/__tests__/architecture-regression.test.js +5 -0
- package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/build-golden-trace-from-artificer.test.d.ts +2 -0
- package/dist/runtime-v2/__tests__/build-golden-trace-from-artificer.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/build-golden-trace-from-artificer.test.js +169 -0
- package/dist/runtime-v2/__tests__/build-golden-trace-from-artificer.test.js.map +1 -0
- package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.d.ts +2 -0
- package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js +815 -0
- package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js.map +1 -0
- package/dist/runtime-v2/__tests__/internalization-peer-runner-contracts.test.js +6 -0
- package/dist/runtime-v2/__tests__/internalization-peer-runner-contracts.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/pitask-metadata.test.js +4 -0
- package/dist/runtime-v2/__tests__/pitask-metadata.test.js.map +1 -1
- package/dist/runtime-v2/adapter/__tests__/artificer-l2-adapter.test.d.ts +2 -0
- package/dist/runtime-v2/adapter/__tests__/artificer-l2-adapter.test.d.ts.map +1 -0
- package/dist/runtime-v2/adapter/__tests__/artificer-l2-adapter.test.js +510 -0
- package/dist/runtime-v2/adapter/__tests__/artificer-l2-adapter.test.js.map +1 -0
- package/dist/runtime-v2/adapter/artificer-l2-adapter.d.ts +47 -0
- package/dist/runtime-v2/adapter/artificer-l2-adapter.d.ts.map +1 -0
- package/dist/runtime-v2/adapter/artificer-l2-adapter.js +307 -0
- package/dist/runtime-v2/adapter/artificer-l2-adapter.js.map +1 -0
- package/dist/runtime-v2/adversarial-loop.d.ts +65 -0
- package/dist/runtime-v2/adversarial-loop.d.ts.map +1 -0
- package/dist/runtime-v2/adversarial-loop.js +203 -0
- package/dist/runtime-v2/adversarial-loop.js.map +1 -0
- package/dist/runtime-v2/golden-trace.d.ts +30 -0
- package/dist/runtime-v2/golden-trace.d.ts.map +1 -1
- package/dist/runtime-v2/golden-trace.js +57 -0
- package/dist/runtime-v2/golden-trace.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +10 -6
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +7 -3
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/adversarial-case.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/adversarial-case.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/adversarial-case.test.js +139 -0
- package/dist/runtime-v2/internalization/__tests__/adversarial-case.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/adversarial-feedback.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/adversarial-feedback.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/adversarial-feedback.test.js +62 -0
- package/dist/runtime-v2/internalization/__tests__/adversarial-feedback.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/artificer-output-v2.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/artificer-output-v2.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/artificer-output-v2.test.js +249 -0
- package/dist/runtime-v2/internalization/__tests__/artificer-output-v2.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.js +24 -0
- package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder-v2.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js +2 -2
- package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/evaluator-output-v2.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/evaluator-output-v2.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/evaluator-output-v2.test.js +209 -0
- package/dist/runtime-v2/internalization/__tests__/evaluator-output-v2.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/evaluator-prompt-builder-v2.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/evaluator-prompt-builder-v2.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/evaluator-prompt-builder-v2.test.js +125 -0
- package/dist/runtime-v2/internalization/__tests__/evaluator-prompt-builder-v2.test.js.map +1 -0
- package/dist/runtime-v2/internalization/adversarial-case.d.ts +32 -0
- package/dist/runtime-v2/internalization/adversarial-case.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/adversarial-case.js +68 -0
- package/dist/runtime-v2/internalization/adversarial-case.js.map +1 -0
- package/dist/runtime-v2/internalization/adversarial-feedback.d.ts +23 -0
- package/dist/runtime-v2/internalization/adversarial-feedback.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/adversarial-feedback.js +20 -0
- package/dist/runtime-v2/internalization/adversarial-feedback.js.map +1 -0
- package/dist/runtime-v2/internalization/artificer-output.d.ts +42 -0
- package/dist/runtime-v2/internalization/artificer-output.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/artificer-output.js +147 -0
- package/dist/runtime-v2/internalization/artificer-output.js.map +1 -1
- package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts +10 -2
- package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/artificer-prompt-builder.js +26 -3
- package/dist/runtime-v2/internalization/artificer-prompt-builder.js.map +1 -1
- package/dist/runtime-v2/internalization/artificer-runner.d.ts +7 -0
- package/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/artificer-runner.js +11 -2
- package/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-output.d.ts +63 -0
- package/dist/runtime-v2/internalization/evaluator-output.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-output.js +158 -0
- package/dist/runtime-v2/internalization/evaluator-output.js.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-prompt-builder.d.ts +8 -1
- package/dist/runtime-v2/internalization/evaluator-prompt-builder.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-prompt-builder.js +16 -3
- package/dist/runtime-v2/internalization/evaluator-prompt-builder.js.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.d.ts +82 -2
- package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.js +496 -4
- package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/index.d.ts +9 -4
- package/dist/runtime-v2/internalization/index.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/index.js +6 -2
- package/dist/runtime-v2/internalization/index.js.map +1 -1
- package/dist/runtime-v2/internalization/peer-runner-contracts.d.ts +2 -0
- package/dist/runtime-v2/internalization/peer-runner-contracts.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/peer-runner-contracts.js +19 -9
- package/dist/runtime-v2/internalization/peer-runner-contracts.js.map +1 -1
- package/dist/runtime-v2/internalization/pitask-metadata.d.ts +7 -0
- package/dist/runtime-v2/internalization/pitask-metadata.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/pitask-metadata.js +15 -5
- package/dist/runtime-v2/internalization/pitask-metadata.js.map +1 -1
- package/dist/runtime-v2/internalization/prompt-serializer.d.ts +3 -0
- package/dist/runtime-v2/internalization/prompt-serializer.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/prompt-serializer.js +22 -0
- package/dist/runtime-v2/internalization/prompt-serializer.js.map +1 -0
- package/dist/telemetry-event.d.ts +2 -2
- package/dist/telemetry-event.d.ts.map +1 -1
- package/dist/telemetry-event.js +21 -0
- package/dist/telemetry-event.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArtificerL2Adapter (RuleHost MVP Activation, ADR-0014 Amendment 2026-06-17,
|
|
3
|
+
* PRD Decision 8, PRI-424).
|
|
4
|
+
*
|
|
5
|
+
* A PDRuntimeAdapter that runs Artificer through a write-test-fix loop:
|
|
6
|
+
* generate code (LLM) → validate → sandbox replay → on failure, inject
|
|
7
|
+
* RefinerSandboxFailedCase[] feedback into the next attempt → regenerate.
|
|
8
|
+
* Max 3 attempts. On exhaustion, degrade to a V1 output (plan only, no code
|
|
9
|
+
* fields) so the downstream Evaluator's isArtificerOutputV2() returns false
|
|
10
|
+
* and the principle-artifact path remains usable.
|
|
11
|
+
*
|
|
12
|
+
* Why the loop lives in the adapter (not in BasePeerRunner.succeedTask):
|
|
13
|
+
* BasePeerRunner.run() is strictly linear (lease → buildContext → invokeRuntime
|
|
14
|
+
* → poll → fetch → validate → succeedTask). succeedTask runs AFTER invokeRuntime
|
|
15
|
+
* returns a terminal output and cannot loop back to invokeRuntime. Encapsulating
|
|
16
|
+
* the write-test-fix loop inside a PDRuntimeAdapter (like Dreamer's
|
|
17
|
+
* L2AgentLoopAdapter) keeps BasePeerRunner unchanged — it still sees a single
|
|
18
|
+
* startRun() that blocks until the loop finishes.
|
|
19
|
+
*
|
|
20
|
+
* Testability: the LLM call is an injected `generateCode` function (mockable).
|
|
21
|
+
* Sandbox replay uses the real evaluateRefinerRuleHostGate with an injected
|
|
22
|
+
* RefinerRuleHostGateDeps. No real LLM calls in tests.
|
|
23
|
+
*
|
|
24
|
+
* ERR considerations (EP-05 Loop State Freshness):
|
|
25
|
+
* - Each attempt reads FRESH sandbox errors. The feedback string injected into
|
|
26
|
+
* attempt N+1 is built from attempt N's RefinerSandboxFailedCase[], never
|
|
27
|
+
* from a stale earlier attempt. (ERR-015/018/019)
|
|
28
|
+
* - The recorded output is always from the attempt that produced it, not a
|
|
29
|
+
* blend of multiple attempts.
|
|
30
|
+
*/
|
|
31
|
+
import { randomUUID } from 'node:crypto';
|
|
32
|
+
import { evaluateRefinerRuleHostGate } from '../internalization/refiner-rulehost-gate.js';
|
|
33
|
+
import { isArtificerOutputV2 } from '../internalization/artificer-output.js';
|
|
34
|
+
import { buildGoldenTraceFromArtificer } from '../golden-trace.js';
|
|
35
|
+
import { PDRuntimeError } from '../error-categories.js';
|
|
36
|
+
import { storeEmitter } from '../store/event-emitter.js';
|
|
37
|
+
import { safeStringifyPreview, truncatePreview } from './output-repair-contract.js';
|
|
38
|
+
const DEFAULT_MAX_ATTEMPTS = 3;
|
|
39
|
+
const MAX_RETAINED_RUNS = 100;
|
|
40
|
+
/** Build the feedback string injected into the next LLM attempt. */
|
|
41
|
+
function isRecord(v) {
|
|
42
|
+
return v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Ensure the candidate carries the expected taskId (LLM may echo a stale or
|
|
46
|
+
* example id). Only fills when absent via Object.hasOwn — present-but-wrong
|
|
47
|
+
* values reach the validator and fail loud (Runtime Contract Rule 3).
|
|
48
|
+
*/
|
|
49
|
+
function injectTaskId(candidate, taskId) {
|
|
50
|
+
if (isRecord(candidate) && !Object.hasOwn(candidate, 'taskId')) {
|
|
51
|
+
candidate.taskId = taskId;
|
|
52
|
+
}
|
|
53
|
+
return candidate;
|
|
54
|
+
}
|
|
55
|
+
function formatSandboxFeedback(failedCases) {
|
|
56
|
+
const lines = failedCases.map((c) => `- caseId: ${c.caseId} | errorType: ${c.errorType} | message: ${c.message}`);
|
|
57
|
+
return [
|
|
58
|
+
'--- Previous sandbox replay failures (fix these) ---',
|
|
59
|
+
...lines,
|
|
60
|
+
'--- end failures ---',
|
|
61
|
+
].join('\n');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Strip the V2 code fields from an output, producing a V1-compatible object
|
|
65
|
+
* (plan + lineage only). Used on L2 exhaustion so the principle-artifact path
|
|
66
|
+
* still works. Returns a fresh object; does not mutate the input.
|
|
67
|
+
*/
|
|
68
|
+
function degradeToV1(v2) {
|
|
69
|
+
const { implementationCode: _code, goldenTraceCases: _cases, affectedTools: _tools, ...v1 } = v2;
|
|
70
|
+
void _code;
|
|
71
|
+
void _cases;
|
|
72
|
+
void _tools;
|
|
73
|
+
return v1;
|
|
74
|
+
}
|
|
75
|
+
export class ArtificerL2Adapter {
|
|
76
|
+
config;
|
|
77
|
+
generateCode;
|
|
78
|
+
gateDeps;
|
|
79
|
+
validator;
|
|
80
|
+
eventEmitter;
|
|
81
|
+
runs = new Map();
|
|
82
|
+
constructor(config) {
|
|
83
|
+
const maxAttempts = config.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
84
|
+
if (!Number.isInteger(maxAttempts) || maxAttempts <= 0) {
|
|
85
|
+
throw new RangeError('maxAttempts must be a positive integer');
|
|
86
|
+
}
|
|
87
|
+
this.generateCode = config.generateCode;
|
|
88
|
+
this.gateDeps = config.gateDeps;
|
|
89
|
+
this.validator = config.validator;
|
|
90
|
+
this.eventEmitter = config.eventEmitter ?? storeEmitter;
|
|
91
|
+
this.config = { maxAttempts };
|
|
92
|
+
}
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this -- required by interface
|
|
94
|
+
kind() {
|
|
95
|
+
return 'pi-ai-l2';
|
|
96
|
+
}
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this -- required by interface
|
|
98
|
+
async getCapabilities() {
|
|
99
|
+
return {
|
|
100
|
+
supportsStructuredJsonOutput: true,
|
|
101
|
+
supportsToolUse: false,
|
|
102
|
+
supportsWorkingDirectory: false,
|
|
103
|
+
supportsModelSelection: true,
|
|
104
|
+
supportsLongRunningSessions: false,
|
|
105
|
+
supportsCancellation: true,
|
|
106
|
+
supportsArtifactWriteBack: false,
|
|
107
|
+
supportsConcurrentRuns: false,
|
|
108
|
+
supportsStreaming: false,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async refreshCapabilities() {
|
|
112
|
+
return this.getCapabilities();
|
|
113
|
+
}
|
|
114
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this -- required by interface
|
|
115
|
+
async healthCheck() {
|
|
116
|
+
return {
|
|
117
|
+
healthy: true,
|
|
118
|
+
degraded: false,
|
|
119
|
+
warnings: [],
|
|
120
|
+
lastCheckedAt: new Date().toISOString(),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
async startRun(input) {
|
|
124
|
+
const runId = randomUUID();
|
|
125
|
+
const startedAt = new Date().toISOString();
|
|
126
|
+
const taskId = input.taskRef?.taskId ?? runId;
|
|
127
|
+
const initialPrompt = typeof input.inputPayload === 'string'
|
|
128
|
+
? truncatePreview(input.inputPayload, 50_000)
|
|
129
|
+
: safeStringifyPreview(input.inputPayload, 50_000);
|
|
130
|
+
const runState = {
|
|
131
|
+
runId,
|
|
132
|
+
startedAt,
|
|
133
|
+
endedAt: startedAt,
|
|
134
|
+
status: 'failed',
|
|
135
|
+
output: null,
|
|
136
|
+
};
|
|
137
|
+
this.runs.set(runId, runState);
|
|
138
|
+
this.evictOldRuns();
|
|
139
|
+
let lastValidV2 = null;
|
|
140
|
+
let lastFailureFeedback = null;
|
|
141
|
+
for (let attempt = 1; attempt <= this.config.maxAttempts; attempt += 1) {
|
|
142
|
+
// Build prompt: initial + (on retry) the IMMEDIATELY-PRIOR attempt's failure feedback.
|
|
143
|
+
// EP-05: lastFailureFeedback is reassigned each iteration from the current attempt's
|
|
144
|
+
// sandbox result, so attempt N+1 always sees attempt N's errors, never stale ones.
|
|
145
|
+
const prompt = lastFailureFeedback === null
|
|
146
|
+
? initialPrompt
|
|
147
|
+
: `${initialPrompt}\n\n${lastFailureFeedback}`;
|
|
148
|
+
let candidateRaw;
|
|
149
|
+
try {
|
|
150
|
+
candidateRaw = await this.generateCode(prompt);
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
// LLM call threw — record and continue to next attempt (or degrade).
|
|
154
|
+
const llmError = err instanceof Error ? err.message : String(err);
|
|
155
|
+
lastFailureFeedback = `--- LLM call failed ---\n${llmError}`;
|
|
156
|
+
this.emitAttempt({ taskId, runId, attempt, decision: 'llm_error' });
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
// Validate the candidate. taskId is injected for lineage consistency.
|
|
160
|
+
const candidateWithTaskId = injectTaskId(candidateRaw, taskId);
|
|
161
|
+
const validation = await this.validator.validate(candidateWithTaskId, taskId);
|
|
162
|
+
if (!validation.valid) {
|
|
163
|
+
// Malformed output (e.g. missing affectedTools). Feed the validator errors back.
|
|
164
|
+
// P2 fix: do NOT update lastValidV2 here — degradation must only trust candidates
|
|
165
|
+
// that PASSED validation, otherwise we'd emit an unvalidated V1 downstream.
|
|
166
|
+
lastFailureFeedback = `--- Validator rejected previous output ---\n${validation.errors.join('\n')}`;
|
|
167
|
+
this.emitAttempt({ taskId, runId, attempt, decision: 'validator_rejected' });
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
// V1 output (no code fields) — nothing to replay. Accept as-is (L1 equivalent).
|
|
171
|
+
if (!isArtificerOutputV2(candidateWithTaskId)) {
|
|
172
|
+
this.emitAttempt({ taskId, runId, attempt, decision: 'v1_accepted' });
|
|
173
|
+
this.emitComplete({ taskId, runId, attempts: attempt, degraded: false, succeeded: true });
|
|
174
|
+
this.completeRun(runId, 'succeeded', candidateWithTaskId);
|
|
175
|
+
return this.runHandle(runId, startedAt);
|
|
176
|
+
}
|
|
177
|
+
const v2 = candidateWithTaskId;
|
|
178
|
+
lastValidV2 = v2;
|
|
179
|
+
// Build the GoldenTrace for sandbox replay.
|
|
180
|
+
const traceResult = buildGoldenTraceFromArtificer({
|
|
181
|
+
cases: v2.goldenTraceCases,
|
|
182
|
+
sourceArtifactId: undefined,
|
|
183
|
+
});
|
|
184
|
+
if (!traceResult.ok) {
|
|
185
|
+
lastFailureFeedback = `--- Golden trace build failed ---\n${traceResult.reason}`;
|
|
186
|
+
this.emitAttempt({ taskId, runId, attempt, decision: 'trace_build_failed' });
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
// Sandbox replay.
|
|
190
|
+
const gateResult = evaluateRefinerRuleHostGate({ code: v2.implementationCode, goldenTrace: traceResult.trace }, this.gateDeps);
|
|
191
|
+
if (gateResult.decision === 'accepted_shadow') {
|
|
192
|
+
// Success — store the V2 output.
|
|
193
|
+
this.emitAttempt({ taskId, runId, attempt, decision: 'replay_passed' });
|
|
194
|
+
this.emitComplete({ taskId, runId, attempts: attempt, degraded: false, succeeded: true });
|
|
195
|
+
this.completeRun(runId, 'succeeded', v2);
|
|
196
|
+
return this.runHandle(runId, startedAt);
|
|
197
|
+
}
|
|
198
|
+
// Replay failed — capture THIS attempt's failures for the next prompt (EP-05).
|
|
199
|
+
const { failedCases } = gateResult.sandboxResult;
|
|
200
|
+
lastFailureFeedback = failedCases.length > 0
|
|
201
|
+
? formatSandboxFeedback(failedCases)
|
|
202
|
+
: `--- Sandbox replay failed ---\n${gateResult.decision}: ${gateResult.reasons.join('; ')}`;
|
|
203
|
+
this.emitAttempt({ taskId, runId, attempt, decision: 'replay_failed' });
|
|
204
|
+
}
|
|
205
|
+
// Exhaustion: degrade to V1 if we ever saw a VALIDATED V2 candidate, else fail.
|
|
206
|
+
if (lastValidV2) {
|
|
207
|
+
const v1 = degradeToV1(lastValidV2);
|
|
208
|
+
this.emitComplete({ taskId, runId, attempts: this.config.maxAttempts, degraded: true, succeeded: false });
|
|
209
|
+
this.completeRun(runId, 'succeeded', v1);
|
|
210
|
+
return this.runHandle(runId, startedAt);
|
|
211
|
+
}
|
|
212
|
+
// No validated candidate ever produced — fail loud (Runtime Contract Rule 9).
|
|
213
|
+
// Throw PDRuntimeError so BasePeerRunner's handlePostLeaseError handles it
|
|
214
|
+
// (aligns with Dreamer L2's failure pattern in L2AgentLoopAdapter).
|
|
215
|
+
runState.status = 'failed';
|
|
216
|
+
runState.endedAt = new Date().toISOString();
|
|
217
|
+
runState.reason = `Artificer L2 exhausted ${this.config.maxAttempts} attempts without a validated candidate`;
|
|
218
|
+
this.emitComplete({ taskId, runId, attempts: this.config.maxAttempts, degraded: false, succeeded: false });
|
|
219
|
+
throw new PDRuntimeError('output_invalid', runState.reason, { nextAction: 'inspect artificer L2 feedback chain; verify LLM produces parseable ArtificerOutputV1/V2' });
|
|
220
|
+
}
|
|
221
|
+
async pollRun(runId) {
|
|
222
|
+
const state = this.runs.get(runId);
|
|
223
|
+
if (!state) {
|
|
224
|
+
return { runId, status: 'failed', reason: 'run not found' };
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
runId: state.runId,
|
|
228
|
+
status: state.status,
|
|
229
|
+
startedAt: state.startedAt,
|
|
230
|
+
endedAt: state.endedAt,
|
|
231
|
+
reason: state.reason,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
async cancelRun(runId) {
|
|
235
|
+
const state = this.runs.get(runId);
|
|
236
|
+
if (state && state.status !== 'succeeded') {
|
|
237
|
+
state.status = 'failed';
|
|
238
|
+
state.endedAt = new Date().toISOString();
|
|
239
|
+
state.reason = 'cancelled';
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async fetchOutput(runId) {
|
|
243
|
+
const state = this.runs.get(runId);
|
|
244
|
+
return state?.output ?? null;
|
|
245
|
+
}
|
|
246
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this -- required by interface
|
|
247
|
+
async fetchArtifacts(_runId) {
|
|
248
|
+
return [];
|
|
249
|
+
}
|
|
250
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this -- required by interface, no-op for L2 artificer
|
|
251
|
+
async appendContext(_runId, _items) {
|
|
252
|
+
// No-op: L2 artificer builds its full prompt in startRun.
|
|
253
|
+
}
|
|
254
|
+
// ── internals ──────────────────────────────────────────────────────────────
|
|
255
|
+
completeRun(runId, status, payload) {
|
|
256
|
+
const state = this.runs.get(runId);
|
|
257
|
+
if (!state)
|
|
258
|
+
return;
|
|
259
|
+
state.status = status;
|
|
260
|
+
state.endedAt = new Date().toISOString();
|
|
261
|
+
state.output = { runId, payload };
|
|
262
|
+
}
|
|
263
|
+
runHandle(runId, startedAt) {
|
|
264
|
+
// RunHandleSchema = { runId, runtimeKind, startedAt } — no status field.
|
|
265
|
+
// The run's terminal status is reported via pollRun(), not the handle.
|
|
266
|
+
return {
|
|
267
|
+
runId,
|
|
268
|
+
runtimeKind: this.kind(),
|
|
269
|
+
startedAt,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
emitAttempt(opts) {
|
|
273
|
+
this.eventEmitter.emitTelemetry({
|
|
274
|
+
eventType: 'artificer_l2_attempt',
|
|
275
|
+
traceId: opts.taskId,
|
|
276
|
+
timestamp: new Date().toISOString(),
|
|
277
|
+
sessionId: 'l2-adapter',
|
|
278
|
+
agentId: 'artificer-l2',
|
|
279
|
+
payload: { runId: opts.runId, attempt: opts.attempt, decision: opts.decision },
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
emitComplete(opts) {
|
|
283
|
+
this.eventEmitter.emitTelemetry({
|
|
284
|
+
eventType: 'artificer_l2_complete',
|
|
285
|
+
traceId: opts.taskId,
|
|
286
|
+
timestamp: new Date().toISOString(),
|
|
287
|
+
sessionId: 'l2-adapter',
|
|
288
|
+
agentId: 'artificer-l2',
|
|
289
|
+
payload: {
|
|
290
|
+
runId: opts.runId,
|
|
291
|
+
attempts: opts.attempts,
|
|
292
|
+
degraded: opts.degraded,
|
|
293
|
+
succeeded: opts.succeeded,
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
evictOldRuns() {
|
|
298
|
+
if (this.runs.size <= MAX_RETAINED_RUNS)
|
|
299
|
+
return;
|
|
300
|
+
const excess = this.runs.size - MAX_RETAINED_RUNS;
|
|
301
|
+
const keys = [...this.runs.keys()].slice(0, excess);
|
|
302
|
+
for (const key of keys) {
|
|
303
|
+
this.runs.delete(key);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=artificer-l2-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artificer-l2-adapter.js","sourceRoot":"","sources":["../../../src/runtime-v2/adapter/artificer-l2-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runAdversarialLoop — synchronous Round 1→N Artificer↔Evaluator adversarial
|
|
3
|
+
* loop (RuleHost MVP, PRI-428, PRD Decision 11 multi-round).
|
|
4
|
+
*
|
|
5
|
+
* This is a SEPARATE execution entry point from the lease-based
|
|
6
|
+
* InternalizationOrchestrator (which is single-step + successor-proposal).
|
|
7
|
+
* It wraps real ArtificerRunner + EvaluatorRunner instances and drives the
|
|
8
|
+
* cross-runner retry loop synchronously, injecting prior adversarial
|
|
9
|
+
* failures into Round-2+ Artificer prompts.
|
|
10
|
+
*
|
|
11
|
+
* Design constraints:
|
|
12
|
+
* - Does NOT modify InternalizationOrchestrator, BasePeerRunner, or the
|
|
13
|
+
* lease-based execution model.
|
|
14
|
+
* - Creates fresh task records per round (deterministic IDs) so the runners
|
|
15
|
+
* can lease + run them through their normal pipeline.
|
|
16
|
+
* - Every failure mode degrades to { decision: 'rejected' } with a
|
|
17
|
+
* structured degradationReason — the loop never throws (ERR-018).
|
|
18
|
+
* - PRD hard cap: maxRounds = 2.
|
|
19
|
+
*
|
|
20
|
+
* @see docs/plans/rulehost-mvp-activation.md Decision 11 multi-round pseudocode
|
|
21
|
+
*/
|
|
22
|
+
import type { ArtificerRunner } from './internalization/artificer-runner.js';
|
|
23
|
+
import type { EvaluatorRunner } from './internalization/evaluator-runner.js';
|
|
24
|
+
import type { RuntimeStateManager } from './store/runtime-state-manager.js';
|
|
25
|
+
import type { PIArtifactStore } from './internalization/pi-artifact.js';
|
|
26
|
+
import type { EvaluatorAdversarialResult } from './internalization/evaluator-output.js';
|
|
27
|
+
/** PRD hard cap on adversarial rounds. */
|
|
28
|
+
export declare const DEFAULT_MAX_ROUNDS = 2;
|
|
29
|
+
export interface AdversarialLoopInput {
|
|
30
|
+
readonly artificerRunner: ArtificerRunner;
|
|
31
|
+
readonly evaluatorRunner: EvaluatorRunner;
|
|
32
|
+
readonly stateManager: RuntimeStateManager;
|
|
33
|
+
/** Shared artifact store (the same one both runners were constructed with). */
|
|
34
|
+
readonly artifactStore: PIArtifactStore;
|
|
35
|
+
/** Succeeded scribe task the Round-1 Artificer depends on. */
|
|
36
|
+
readonly scribeTaskId: string;
|
|
37
|
+
/** Max rounds (PRD cap = 2). Defaults to DEFAULT_MAX_ROUNDS. */
|
|
38
|
+
readonly maxRounds?: number;
|
|
39
|
+
/** Correlation prefix for task IDs (default 'adversarial-loop'). */
|
|
40
|
+
readonly correlationId?: string;
|
|
41
|
+
/** Channel for created tasks (default 'prompt'). */
|
|
42
|
+
readonly channel?: 'prompt' | 'code_tool_hook' | 'defer_archive';
|
|
43
|
+
}
|
|
44
|
+
export interface AdversarialLoopResult {
|
|
45
|
+
/** Final outcome. 'approved' = rule artifact written; 'rejected' = degraded. */
|
|
46
|
+
readonly decision: 'approved' | 'rejected';
|
|
47
|
+
/** Number of rounds actually executed (1..maxRounds). */
|
|
48
|
+
readonly rounds: number;
|
|
49
|
+
/** The final evaluator task's ID (for lineage/telemetry lookup). */
|
|
50
|
+
readonly finalEvaluatorTaskId: string;
|
|
51
|
+
/** Rule artifact ID when approved; null otherwise. */
|
|
52
|
+
readonly ruleArtifactId: string | null;
|
|
53
|
+
/** Principle artifact ID (always present on the final evaluator task). */
|
|
54
|
+
readonly principleArtifactId: string | null;
|
|
55
|
+
/** Adversarial result from the final round, when V2 path ran. */
|
|
56
|
+
readonly adversarialResult?: EvaluatorAdversarialResult;
|
|
57
|
+
/** Structured reason when decision === 'rejected'. */
|
|
58
|
+
readonly degradationReason?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Run the multi-round adversarial loop. Never throws — all failure modes
|
|
62
|
+
* return { decision: 'rejected', degradationReason }.
|
|
63
|
+
*/
|
|
64
|
+
export declare function runAdversarialLoop(input: AdversarialLoopInput): Promise<AdversarialLoopResult>;
|
|
65
|
+
//# sourceMappingURL=adversarial-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adversarial-loop.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/adversarial-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGxE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAKxF,0CAA0C;AAC1C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,gEAAgE;IAChE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,oDAAoD;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,gBAAgB,GAAG,eAAe,CAAC;CAClE;AAED,MAAM,WAAW,qBAAqB;IACpC,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAC3C,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,sDAAsD;IACtD,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,0EAA0E;IAC1E,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,iEAAiE;IACjE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;IACxD,sDAAsD;IACtD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA4JpG"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { isArtificerOutputV2 } from './internalization/artificer-output.js';
|
|
2
|
+
import { isEvaluatorOutputV2 } from './internalization/evaluator-output.js';
|
|
3
|
+
import { formatAdversarialFeedback } from './internalization/adversarial-feedback.js';
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-use-before-define -- helper functions declared after main, matching codebase convention */
|
|
5
|
+
import { createPITaskDiagnosticJson } from './internalization/pitask-metadata.js';
|
|
6
|
+
/** PRD hard cap on adversarial rounds. */
|
|
7
|
+
export const DEFAULT_MAX_ROUNDS = 2;
|
|
8
|
+
/**
|
|
9
|
+
* Run the multi-round adversarial loop. Never throws — all failure modes
|
|
10
|
+
* return { decision: 'rejected', degradationReason }.
|
|
11
|
+
*/
|
|
12
|
+
export async function runAdversarialLoop(input) {
|
|
13
|
+
const requestedRounds = input.maxRounds ?? DEFAULT_MAX_ROUNDS;
|
|
14
|
+
const maxRounds = Number.isFinite(requestedRounds)
|
|
15
|
+
? Math.max(1, Math.min(DEFAULT_MAX_ROUNDS, Math.floor(requestedRounds)))
|
|
16
|
+
: DEFAULT_MAX_ROUNDS;
|
|
17
|
+
const correlation = input.correlationId ?? 'adversarial-loop';
|
|
18
|
+
const channel = input.channel ?? 'prompt';
|
|
19
|
+
let adversarialFeedback = undefined;
|
|
20
|
+
let lastEvaluatorTaskId = '';
|
|
21
|
+
let lastPrincipleArtifactId = null;
|
|
22
|
+
let lastAdversarialResult;
|
|
23
|
+
for (let round = 1; round <= maxRounds; round += 1) {
|
|
24
|
+
// ── Round N: Artificer ──
|
|
25
|
+
const artificerTaskId = `${correlation}-artificer-r${round}-${Date.now().toString(36)}`;
|
|
26
|
+
try {
|
|
27
|
+
await input.stateManager.createTask({
|
|
28
|
+
taskId: artificerTaskId,
|
|
29
|
+
taskKind: 'artificer',
|
|
30
|
+
status: 'pending',
|
|
31
|
+
attemptCount: 0,
|
|
32
|
+
maxAttempts: 3,
|
|
33
|
+
diagnosticJson: createPITaskDiagnosticJson({
|
|
34
|
+
dependencyTaskIds: [input.scribeTaskId],
|
|
35
|
+
channel,
|
|
36
|
+
timeoutMs: 300_000,
|
|
37
|
+
inputArtifactRefs: [],
|
|
38
|
+
outputArtifactRefs: [],
|
|
39
|
+
adversarialFeedback,
|
|
40
|
+
}),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch (createErr) {
|
|
44
|
+
return rejected(round, lastEvaluatorTaskId, lastPrincipleArtifactId, lastAdversarialResult, `artificer_task_create_failed: ${createErr instanceof Error ? createErr.message : String(createErr)}`);
|
|
45
|
+
}
|
|
46
|
+
let artificerResult;
|
|
47
|
+
try {
|
|
48
|
+
artificerResult = await input.artificerRunner.run(artificerTaskId);
|
|
49
|
+
}
|
|
50
|
+
catch (runErr) {
|
|
51
|
+
return rejected(round, lastEvaluatorTaskId, lastPrincipleArtifactId, lastAdversarialResult, `artificer_run_threw: ${runErr instanceof Error ? runErr.message : String(runErr)}`);
|
|
52
|
+
}
|
|
53
|
+
if (artificerResult.status !== 'succeeded' || !artificerResult.output) {
|
|
54
|
+
return rejected(round, lastEvaluatorTaskId, lastPrincipleArtifactId, lastAdversarialResult, `artificer_run_status_${artificerResult.status ?? 'unknown'}`);
|
|
55
|
+
}
|
|
56
|
+
const artificerOutput = artificerResult.output;
|
|
57
|
+
const artificerArtifactId = artificerResult.artifactId ?? null;
|
|
58
|
+
// ── V1 degradation: Artificer L2 fell back to plan-only (no code) ──
|
|
59
|
+
// Per PRD: skip code review, run evaluator on the V1 plan, degrade.
|
|
60
|
+
if (!isArtificerOutputV2(artificerOutput)) {
|
|
61
|
+
const v1EvaluatorTaskId = `${correlation}-evaluator-r${round}-${Date.now().toString(36)}`;
|
|
62
|
+
try {
|
|
63
|
+
await createEvaluatorTask(input.stateManager, v1EvaluatorTaskId, artificerTaskId, channel);
|
|
64
|
+
await input.evaluatorRunner.run(v1EvaluatorTaskId);
|
|
65
|
+
}
|
|
66
|
+
catch (v1Err) {
|
|
67
|
+
// Non-fatal: we're degrading anyway. Principle artifact may still be
|
|
68
|
+
// written by the evaluator; if not, principleArtifactId resolves null.
|
|
69
|
+
// Catching here preserves the loop's never-throws contract (ERR-018).
|
|
70
|
+
void v1Err;
|
|
71
|
+
}
|
|
72
|
+
const v1Principle = await resolvePrincipleArtifactId(input, v1EvaluatorTaskId);
|
|
73
|
+
return {
|
|
74
|
+
decision: 'rejected',
|
|
75
|
+
rounds: round,
|
|
76
|
+
finalEvaluatorTaskId: v1EvaluatorTaskId,
|
|
77
|
+
ruleArtifactId: null,
|
|
78
|
+
principleArtifactId: v1Principle,
|
|
79
|
+
degradationReason: 'artificer_degraded_to_v1_no_implementation_code',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// ── Round N: Evaluator (V2 code-review + adversarial replay) ──
|
|
83
|
+
const evaluatorTaskId = `${correlation}-evaluator-r${round}-${Date.now().toString(36)}`;
|
|
84
|
+
lastEvaluatorTaskId = evaluatorTaskId;
|
|
85
|
+
try {
|
|
86
|
+
await createEvaluatorTask(input.stateManager, evaluatorTaskId, artificerTaskId, channel);
|
|
87
|
+
}
|
|
88
|
+
catch (createErr) {
|
|
89
|
+
return rejected(round, lastEvaluatorTaskId, lastPrincipleArtifactId, lastAdversarialResult, `evaluator_task_create_failed: ${createErr instanceof Error ? createErr.message : String(createErr)}`);
|
|
90
|
+
}
|
|
91
|
+
let evaluatorResult;
|
|
92
|
+
try {
|
|
93
|
+
evaluatorResult = await input.evaluatorRunner.run(evaluatorTaskId);
|
|
94
|
+
}
|
|
95
|
+
catch (runErr) {
|
|
96
|
+
return rejected(round, evaluatorTaskId, lastPrincipleArtifactId, lastAdversarialResult, `evaluator_run_threw: ${runErr instanceof Error ? runErr.message : String(runErr)}`);
|
|
97
|
+
}
|
|
98
|
+
if (evaluatorResult.status !== 'succeeded' || !evaluatorResult.output) {
|
|
99
|
+
return rejected(round, evaluatorTaskId, lastPrincipleArtifactId, lastAdversarialResult, `evaluator_run_status_${evaluatorResult.status ?? 'unknown'}`);
|
|
100
|
+
}
|
|
101
|
+
const evaluatorOutput = evaluatorResult.output;
|
|
102
|
+
const { decision } = evaluatorOutput.evaluation;
|
|
103
|
+
lastPrincipleArtifactId = evaluatorResult.artifactId ?? await resolvePrincipleArtifactId(input, evaluatorTaskId);
|
|
104
|
+
if (isEvaluatorOutputV2(evaluatorOutput) && evaluatorOutput.adversarialResult) {
|
|
105
|
+
lastAdversarialResult = evaluatorOutput.adversarialResult;
|
|
106
|
+
}
|
|
107
|
+
if (decision === 'approved') {
|
|
108
|
+
// Rule artifact written by EvaluatorRunner.succeedTask (PRI-427) when
|
|
109
|
+
// adversarialResult.passed === true. Resolve it from the store.
|
|
110
|
+
const ruleArtifactId = await resolveRuleArtifactId(input, evaluatorTaskId);
|
|
111
|
+
if (!ruleArtifactId) {
|
|
112
|
+
return rejected(round, evaluatorTaskId, lastPrincipleArtifactId, lastAdversarialResult, 'evaluator_approved_without_rule_artifact');
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
decision: 'approved',
|
|
116
|
+
rounds: round,
|
|
117
|
+
finalEvaluatorTaskId: evaluatorTaskId,
|
|
118
|
+
ruleArtifactId,
|
|
119
|
+
principleArtifactId: lastPrincipleArtifactId,
|
|
120
|
+
adversarialResult: lastAdversarialResult,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
if (decision === 'rejected') {
|
|
124
|
+
return {
|
|
125
|
+
decision: 'rejected',
|
|
126
|
+
rounds: round,
|
|
127
|
+
finalEvaluatorTaskId: evaluatorTaskId,
|
|
128
|
+
ruleArtifactId: null,
|
|
129
|
+
principleArtifactId: lastPrincipleArtifactId,
|
|
130
|
+
adversarialResult: lastAdversarialResult,
|
|
131
|
+
degradationReason: 'evaluator_rejected',
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// needs_revision: prepare feedback for the next round.
|
|
135
|
+
const failedCases = isEvaluatorOutputV2(evaluatorOutput) && evaluatorOutput.adversarialResult
|
|
136
|
+
? evaluatorOutput.adversarialResult.failedCases
|
|
137
|
+
: [];
|
|
138
|
+
adversarialFeedback = formatAdversarialFeedback(failedCases);
|
|
139
|
+
// Loop continues to next round.
|
|
140
|
+
void artificerArtifactId;
|
|
141
|
+
}
|
|
142
|
+
// ── Round (maxRounds + 1): exhausted, degrade ──
|
|
143
|
+
return {
|
|
144
|
+
decision: 'rejected',
|
|
145
|
+
rounds: maxRounds,
|
|
146
|
+
finalEvaluatorTaskId: lastEvaluatorTaskId,
|
|
147
|
+
ruleArtifactId: null,
|
|
148
|
+
principleArtifactId: lastPrincipleArtifactId,
|
|
149
|
+
adversarialResult: lastAdversarialResult,
|
|
150
|
+
degradationReason: `max_rounds_exhausted_after_${maxRounds}`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
154
|
+
// eslint-disable-next-line @typescript-eslint/max-params
|
|
155
|
+
async function createEvaluatorTask(stateManager, evaluatorTaskId, artificerTaskId, channel) {
|
|
156
|
+
await stateManager.createTask({
|
|
157
|
+
taskId: evaluatorTaskId,
|
|
158
|
+
taskKind: 'evaluator',
|
|
159
|
+
status: 'pending',
|
|
160
|
+
attemptCount: 0,
|
|
161
|
+
maxAttempts: 3,
|
|
162
|
+
diagnosticJson: createPITaskDiagnosticJson({
|
|
163
|
+
dependencyTaskIds: [artificerTaskId],
|
|
164
|
+
channel,
|
|
165
|
+
timeoutMs: 300_000,
|
|
166
|
+
inputArtifactRefs: [],
|
|
167
|
+
outputArtifactRefs: [],
|
|
168
|
+
}),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async function resolvePrincipleArtifactId(input, evaluatorTaskId) {
|
|
172
|
+
try {
|
|
173
|
+
const artifacts = await input.artifactStore.listBySourceTaskId(evaluatorTaskId);
|
|
174
|
+
const principle = artifacts.find((a) => a.artifactKind === 'principle');
|
|
175
|
+
return principle?.artifactId ?? null;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async function resolveRuleArtifactId(input, evaluatorTaskId) {
|
|
182
|
+
try {
|
|
183
|
+
const artifacts = await input.artifactStore.listBySourceTaskId(evaluatorTaskId);
|
|
184
|
+
const rule = artifacts.find((a) => a.artifactKind === 'rule');
|
|
185
|
+
return rule?.artifactId ?? null;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// eslint-disable-next-line @typescript-eslint/max-params
|
|
192
|
+
function rejected(rounds, finalEvaluatorTaskId, principleArtifactId, adversarialResult, reason) {
|
|
193
|
+
return {
|
|
194
|
+
decision: 'rejected',
|
|
195
|
+
rounds,
|
|
196
|
+
finalEvaluatorTaskId,
|
|
197
|
+
ruleArtifactId: null,
|
|
198
|
+
principleArtifactId,
|
|
199
|
+
adversarialResult,
|
|
200
|
+
degradationReason: reason,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=adversarial-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adversarial-loop.js","sourceRoot":"","sources":["../../src/runtime-v2/adversarial-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Static } from '@sinclair/typebox';
|
|
2
2
|
import type { RuleHostInput } from './internalization/rule-host-contracts.js';
|
|
3
|
+
import type { GoldenTraceCaseInput } from './internalization/artificer-output.js';
|
|
3
4
|
export declare const CorrectionApplicationModeSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"shadow">, import("@sinclair/typebox").TLiteral<"live">]>;
|
|
4
5
|
export declare const GoldenTraceDecisionSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"allow">, import("@sinclair/typebox").TLiteral<"block">, import("@sinclair/typebox").TLiteral<"propose_correction">]>;
|
|
5
6
|
export declare const GoldenTraceCaseKindSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"negative">, import("@sinclair/typebox").TLiteral<"positive">]>;
|
|
@@ -77,4 +78,33 @@ export declare function validateGoldenTraceCase(input: unknown): GoldenTraceVali
|
|
|
77
78
|
export declare function validateGoldenTrace(input: unknown): GoldenTraceValidationResult;
|
|
78
79
|
export declare function createSyntheticRuleHostInput(snapshot: ToolCallSnapshot, overrides?: SyntheticRuleHostInputOverrides): RuleHostInput;
|
|
79
80
|
export declare function createGoldenTraceFixture(input: GoldenTraceFixtureInput): GoldenTrace;
|
|
81
|
+
/**
|
|
82
|
+
* Input for buildGoldenTraceFromArtificer (RuleHost MVP Activation, PRD Decision 5).
|
|
83
|
+
*/
|
|
84
|
+
export interface BuildGoldenTraceFromArtificerInput {
|
|
85
|
+
readonly cases: readonly GoldenTraceCaseInput[];
|
|
86
|
+
readonly sourceArtifactId?: string;
|
|
87
|
+
/** Override for createdAt; defaults to current ISO-8601 UTC timestamp. */
|
|
88
|
+
readonly createdAt?: string;
|
|
89
|
+
}
|
|
90
|
+
export type BuildGoldenTraceResult = {
|
|
91
|
+
readonly ok: true;
|
|
92
|
+
readonly trace: GoldenTrace;
|
|
93
|
+
} | {
|
|
94
|
+
readonly ok: false;
|
|
95
|
+
readonly reason: string;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Wrap Artificer's 2-10 GoldenTraceCaseInput[] into a complete GoldenTrace with
|
|
99
|
+
* metadata (traceId / createdAt / version). Unlike createGoldenTraceFixture
|
|
100
|
+
* (fixed 2-case shape), this preserves an arbitrary number of cases.
|
|
101
|
+
*
|
|
102
|
+
* Returns a discriminated union rather than throwing: 0 cases, missing
|
|
103
|
+
* positive/negative partner, or malformed input yields `{ ok: false, reason }`
|
|
104
|
+
* so the caller (Evaluator assembly) can degrade gracefully without try/catch.
|
|
105
|
+
*
|
|
106
|
+
* The produced GoldenTrace is validated against validateGoldenTrace() before
|
|
107
|
+
* returning; a result with ok=true always passes structural validation.
|
|
108
|
+
*/
|
|
109
|
+
export declare function buildGoldenTraceFromArtificer(input: BuildGoldenTraceFromArtificerInput): BuildGoldenTraceResult;
|
|
80
110
|
//# sourceMappingURL=golden-trace.d.ts.map
|