@miller-tech/uap 1.27.0 → 1.28.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/.tsbuildinfo +1 -1
- package/dist/bin/cli.js +2 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/deliver.d.ts +2 -0
- package/dist/cli/deliver.d.ts.map +1 -1
- package/dist/cli/deliver.js +32 -2
- package/dist/cli/deliver.js.map +1 -1
- package/dist/delivery/applier.d.ts +11 -0
- package/dist/delivery/applier.d.ts.map +1 -1
- package/dist/delivery/applier.js +189 -6
- package/dist/delivery/applier.js.map +1 -1
- package/dist/delivery/convergence-loop.d.ts +42 -10
- package/dist/delivery/convergence-loop.d.ts.map +1 -1
- package/dist/delivery/convergence-loop.js +154 -52
- package/dist/delivery/convergence-loop.js.map +1 -1
- package/dist/delivery/critic.d.ts +35 -0
- package/dist/delivery/critic.d.ts.map +1 -0
- package/dist/delivery/critic.js +77 -0
- package/dist/delivery/critic.js.map +1 -0
- package/dist/delivery/explorer.d.ts +77 -0
- package/dist/delivery/explorer.d.ts.map +1 -0
- package/dist/delivery/explorer.js +166 -0
- package/dist/delivery/explorer.js.map +1 -0
- package/dist/delivery/index.d.ts +5 -2
- package/dist/delivery/index.d.ts.map +1 -1
- package/dist/delivery/index.js +4 -1
- package/dist/delivery/index.js.map +1 -1
- package/dist/delivery/judge.d.ts +33 -0
- package/dist/delivery/judge.d.ts.map +1 -0
- package/dist/delivery/judge.js +70 -0
- package/dist/delivery/judge.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applier.js","sourceRoot":"","sources":["../../src/delivery/applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"applier.js","sourceRoot":"","sources":["../../src/delivery/applier.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Convergence Loop
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Drives an underlying model through execute → apply → verify → feedback
|
|
5
|
+
* iterations until the project's completion gates (verifier ladder) pass or
|
|
6
|
+
* the turn budget is exhausted.
|
|
7
7
|
*
|
|
8
|
-
* The loop owns
|
|
9
|
-
* changes:
|
|
8
|
+
* The loop owns pluggable seams so phases extend without breaking changes:
|
|
10
9
|
* - executor: how a prompt becomes model output
|
|
11
10
|
* - applier: how model output is materialized into the project tree
|
|
12
|
-
* - promptBuilder: how instruction/feedback/
|
|
13
|
-
*
|
|
14
|
-
* -
|
|
15
|
-
*
|
|
11
|
+
* - promptBuilder: how instruction/feedback/critique compose a prompt
|
|
12
|
+
* - ladderRunner: how gates are verified
|
|
13
|
+
* - explorer (Phase 2): best-of-N candidate exploration with judge tie-break
|
|
14
|
+
* - critic (Phase 3): structured repair plans replacing raw gate dumps
|
|
15
|
+
* - onIteration: per-turn control hook (Phase 5 escalation controllers)
|
|
16
16
|
*/
|
|
17
17
|
import type { GateRung, LadderResult, LadderOptions } from './verifier-ladder.js';
|
|
18
18
|
import type { Applier } from './applier.js';
|
|
19
|
+
import type { StrategySeed } from './explorer.js';
|
|
20
|
+
import type { Judge } from './judge.js';
|
|
21
|
+
import type { Critic } from './critic.js';
|
|
19
22
|
export type LoopExecutor = (prompt: string) => Promise<string>;
|
|
20
23
|
/** Pluggable ladder runner — production uses runLadder, tests inject a stub. */
|
|
21
24
|
export type LadderRunner = (rungs: GateRung[], projectRoot: string, options?: LadderOptions) => LadderResult | Promise<LadderResult>;
|
|
@@ -23,7 +26,7 @@ export interface PromptContext {
|
|
|
23
26
|
instruction: string;
|
|
24
27
|
/** 1-based turn about to execute */
|
|
25
28
|
turn: number;
|
|
26
|
-
/** Model output from the previous turn (
|
|
29
|
+
/** Model output from the previous turn (truncated) */
|
|
27
30
|
previousOutput?: string;
|
|
28
31
|
/** Gate feedback from the previous turn's ladder run */
|
|
29
32
|
feedback?: string;
|
|
@@ -31,8 +34,17 @@ export interface PromptContext {
|
|
|
31
34
|
applyError?: string;
|
|
32
35
|
/** Files written by the previous turn */
|
|
33
36
|
previousFiles?: string[];
|
|
37
|
+
/** Structured repair steps from the critic (Phase 3) */
|
|
38
|
+
critique?: string[];
|
|
34
39
|
}
|
|
35
40
|
export type PromptBuilder = (context: PromptContext) => string;
|
|
41
|
+
export interface CandidateSummary {
|
|
42
|
+
id: string;
|
|
43
|
+
strategy: string;
|
|
44
|
+
passed: boolean;
|
|
45
|
+
score: number;
|
|
46
|
+
error?: string;
|
|
47
|
+
}
|
|
36
48
|
export interface IterationRecord {
|
|
37
49
|
/** Real 1-based loop turn (executor-error turns are recorded too) */
|
|
38
50
|
turn: number;
|
|
@@ -46,6 +58,12 @@ export interface IterationRecord {
|
|
|
46
58
|
executorError?: string;
|
|
47
59
|
/** Apply failure, if output could not be materialized */
|
|
48
60
|
applyError?: string;
|
|
61
|
+
/** Strategy seed of the committed candidate (explorer mode) */
|
|
62
|
+
strategy?: string;
|
|
63
|
+
/** All candidates evaluated this turn (explorer mode) */
|
|
64
|
+
candidates?: CandidateSummary[];
|
|
65
|
+
/** Judge rationale when a tie-break decided the winner (explorer mode) */
|
|
66
|
+
judgeRationale?: string;
|
|
49
67
|
durationMs: number;
|
|
50
68
|
}
|
|
51
69
|
export interface DeliveryResult {
|
|
@@ -64,6 +82,12 @@ export interface DeliveryResult {
|
|
|
64
82
|
finalOutput: string;
|
|
65
83
|
totalDurationMs: number;
|
|
66
84
|
}
|
|
85
|
+
export interface ExplorerSettings {
|
|
86
|
+
/** Candidates per turn (default 3) */
|
|
87
|
+
candidates?: number;
|
|
88
|
+
seeds?: StrategySeed[];
|
|
89
|
+
judge?: Judge;
|
|
90
|
+
}
|
|
67
91
|
export interface ConvergenceConfig {
|
|
68
92
|
/** Maximum execute→apply→verify iterations (default 5) */
|
|
69
93
|
maxTurns?: number;
|
|
@@ -82,6 +106,10 @@ export interface ConvergenceConfig {
|
|
|
82
106
|
baselineCheck?: boolean;
|
|
83
107
|
/** Max characters of prior model output included in retry prompts (default 3000) */
|
|
84
108
|
previousOutputChars?: number;
|
|
109
|
+
/** Best-of-N exploration per turn (Phase 2); omit for single-candidate turns */
|
|
110
|
+
explorer?: ExplorerSettings;
|
|
111
|
+
/** Structured critique of failed turns (Phase 3) */
|
|
112
|
+
critic?: Critic;
|
|
85
113
|
/**
|
|
86
114
|
* Called after every iteration. Return 'stop' to abort the loop early
|
|
87
115
|
* (Phase 5 escalation controllers hook in here).
|
|
@@ -101,6 +129,10 @@ export declare class ConvergenceLoop {
|
|
|
101
129
|
applier?: Applier;
|
|
102
130
|
promptBuilder?: PromptBuilder;
|
|
103
131
|
});
|
|
132
|
+
/** Single-candidate turn: execute → apply → verify. */
|
|
133
|
+
private runSingleTurn;
|
|
134
|
+
/** Explorer turn: best-of-N candidates, commit the winner (Phase 2). */
|
|
135
|
+
private runExplorerTurn;
|
|
104
136
|
/**
|
|
105
137
|
* Run the loop for an instruction until all required gates pass or the
|
|
106
138
|
* turn budget is exhausted. Returns the full iteration history so callers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convergence-loop.d.ts","sourceRoot":"","sources":["../../src/delivery/convergence-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAElF,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"convergence-loop.d.ts","sourceRoot":"","sources":["../../src/delivery/convergence-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Convergence Loop
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Drives an underlying model through execute → apply → verify → feedback
|
|
5
|
+
* iterations until the project's completion gates (verifier ladder) pass or
|
|
6
|
+
* the turn budget is exhausted.
|
|
7
7
|
*
|
|
8
|
-
* The loop owns
|
|
9
|
-
* changes:
|
|
8
|
+
* The loop owns pluggable seams so phases extend without breaking changes:
|
|
10
9
|
* - executor: how a prompt becomes model output
|
|
11
10
|
* - applier: how model output is materialized into the project tree
|
|
12
|
-
* - promptBuilder: how instruction/feedback/
|
|
13
|
-
*
|
|
14
|
-
* -
|
|
15
|
-
*
|
|
11
|
+
* - promptBuilder: how instruction/feedback/critique compose a prompt
|
|
12
|
+
* - ladderRunner: how gates are verified
|
|
13
|
+
* - explorer (Phase 2): best-of-N candidate exploration with judge tie-break
|
|
14
|
+
* - critic (Phase 3): structured repair plans replacing raw gate dumps
|
|
15
|
+
* - onIteration: per-turn control hook (Phase 5 escalation controllers)
|
|
16
16
|
*/
|
|
17
17
|
import { detectRungs, runLadder } from './verifier-ladder.js';
|
|
18
18
|
import { applyFileBlocks } from './applier.js';
|
|
19
|
+
import { exploreAndCommit } from './explorer.js';
|
|
19
20
|
const DEFAULT_MAX_TURNS = 5;
|
|
20
21
|
const DEFAULT_PREVIOUS_OUTPUT_CHARS = 3_000;
|
|
21
22
|
const OUTPUT_CONTRACT = [
|
|
@@ -47,7 +48,15 @@ export const defaultPromptBuilder = (ctx) => {
|
|
|
47
48
|
if (ctx.applyError) {
|
|
48
49
|
sections.push(`Your output could not be applied: ${ctx.applyError}`);
|
|
49
50
|
}
|
|
51
|
+
// A structured repair plan outranks the raw gate dump: one concrete action
|
|
52
|
+
// per line is what small models can actually execute.
|
|
53
|
+
if (ctx.critique && ctx.critique.length > 0) {
|
|
54
|
+
sections.push('');
|
|
55
|
+
sections.push('REPAIR PLAN — apply these fixes exactly:');
|
|
56
|
+
ctx.critique.forEach((step, i) => sections.push(`${i + 1}. ${step}`));
|
|
57
|
+
}
|
|
50
58
|
if (ctx.feedback) {
|
|
59
|
+
sections.push('');
|
|
51
60
|
sections.push(ctx.feedback);
|
|
52
61
|
}
|
|
53
62
|
if (ctx.previousOutput) {
|
|
@@ -72,6 +81,100 @@ export class ConvergenceLoop {
|
|
|
72
81
|
this.applier = seams.applier ?? applyFileBlocks;
|
|
73
82
|
this.promptBuilder = seams.promptBuilder ?? defaultPromptBuilder;
|
|
74
83
|
}
|
|
84
|
+
/** Single-candidate turn: execute → apply → verify. */
|
|
85
|
+
async runSingleTurn(prompt, rungs) {
|
|
86
|
+
let output = '';
|
|
87
|
+
let executorError;
|
|
88
|
+
try {
|
|
89
|
+
output = await this.executor(prompt);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
executorError = err instanceof Error ? err.message : String(err);
|
|
93
|
+
}
|
|
94
|
+
let applyResult = null;
|
|
95
|
+
let applyError;
|
|
96
|
+
if (!executorError) {
|
|
97
|
+
applyResult = await this.applier(output, this.config.projectRoot);
|
|
98
|
+
if (applyResult.error) {
|
|
99
|
+
applyError = applyResult.error;
|
|
100
|
+
}
|
|
101
|
+
else if (applyResult.rejected.length > 0) {
|
|
102
|
+
applyError = `Rejected blocks: ${applyResult.rejected
|
|
103
|
+
.map((r) => `${r.path} (${r.reason})`)
|
|
104
|
+
.join('; ')}`;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Verify — only when something was applied; otherwise the tree is
|
|
108
|
+
// unchanged and re-running gates would waste minutes for no signal.
|
|
109
|
+
const filesApplied = applyResult?.filesWritten ?? [];
|
|
110
|
+
let ladder = null;
|
|
111
|
+
if (!executorError && filesApplied.length > 0) {
|
|
112
|
+
ladder = await this.ladderRunner(rungs, this.config.projectRoot, this.config.ladderOptions);
|
|
113
|
+
}
|
|
114
|
+
return { output, filesApplied, ladder, executorError, applyError };
|
|
115
|
+
}
|
|
116
|
+
/** Explorer turn: best-of-N candidates, commit the winner (Phase 2). */
|
|
117
|
+
async runExplorerTurn(instruction, prompt, rungs, settings) {
|
|
118
|
+
const exploration = await exploreAndCommit(instruction, prompt, this.executor, {
|
|
119
|
+
candidates: settings.candidates,
|
|
120
|
+
seeds: settings.seeds,
|
|
121
|
+
judge: settings.judge,
|
|
122
|
+
projectRoot: this.config.projectRoot,
|
|
123
|
+
rungs,
|
|
124
|
+
ladderOptions: this.config.ladderOptions,
|
|
125
|
+
ladderRunner: this.ladderRunner,
|
|
126
|
+
});
|
|
127
|
+
const summaries = exploration.candidates.map((c) => ({
|
|
128
|
+
id: c.id,
|
|
129
|
+
strategy: c.strategy,
|
|
130
|
+
passed: c.passed,
|
|
131
|
+
score: c.score,
|
|
132
|
+
error: c.error,
|
|
133
|
+
}));
|
|
134
|
+
const winner = exploration.winner;
|
|
135
|
+
if (!winner) {
|
|
136
|
+
// Distinguish executor failure (no usable model output) from apply
|
|
137
|
+
// failure (output produced but no file blocks) so the retry prompt
|
|
138
|
+
// carries the right guidance — matching single-turn feedback quality.
|
|
139
|
+
const execErrors = exploration.candidates.map((c) => c.error).filter(Boolean);
|
|
140
|
+
if (execErrors.length === exploration.candidates.length && execErrors.length > 0) {
|
|
141
|
+
return {
|
|
142
|
+
output: '',
|
|
143
|
+
filesApplied: [],
|
|
144
|
+
ladder: null,
|
|
145
|
+
executorError: execErrors.join('; '),
|
|
146
|
+
candidates: summaries,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const applyErr = exploration.candidates.map((c) => c.applyResult?.error).find(Boolean) ??
|
|
150
|
+
'No candidate produced applicable file blocks.';
|
|
151
|
+
return {
|
|
152
|
+
output: '',
|
|
153
|
+
filesApplied: [],
|
|
154
|
+
ladder: null,
|
|
155
|
+
applyError: applyErr,
|
|
156
|
+
candidates: summaries,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
let applyError;
|
|
160
|
+
if (winner.applyResult?.error) {
|
|
161
|
+
applyError = winner.applyResult.error;
|
|
162
|
+
}
|
|
163
|
+
else if (winner.applyResult && winner.applyResult.rejected.length > 0) {
|
|
164
|
+
applyError = `Rejected blocks: ${winner.applyResult.rejected
|
|
165
|
+
.map((r) => `${r.path} (${r.reason})`)
|
|
166
|
+
.join('; ')}`;
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
output: winner.output,
|
|
170
|
+
filesApplied: winner.applyResult?.filesWritten ?? [],
|
|
171
|
+
ladder: exploration.ladder,
|
|
172
|
+
applyError,
|
|
173
|
+
strategy: winner.strategy,
|
|
174
|
+
candidates: summaries,
|
|
175
|
+
judgeRationale: exploration.judgeRationale,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
75
178
|
/**
|
|
76
179
|
* Run the loop for an instruction until all required gates pass or the
|
|
77
180
|
* turn budget is exhausted. Returns the full iteration history so callers
|
|
@@ -115,64 +218,63 @@ export class ConvergenceLoop {
|
|
|
115
218
|
for (let turn = 1; turn <= maxTurns; turn++) {
|
|
116
219
|
const turnStart = Date.now();
|
|
117
220
|
const prompt = this.promptBuilder({ instruction, turn, ...prevContext });
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
catch (err) {
|
|
125
|
-
executorError = err instanceof Error ? err.message : String(err);
|
|
126
|
-
}
|
|
127
|
-
finalOutput = output || finalOutput;
|
|
128
|
-
// Apply
|
|
129
|
-
let applyResult = null;
|
|
130
|
-
let applyError;
|
|
131
|
-
if (!executorError) {
|
|
132
|
-
applyResult = await this.applier(output, this.config.projectRoot);
|
|
133
|
-
if (applyResult.error) {
|
|
134
|
-
applyError = applyResult.error;
|
|
135
|
-
}
|
|
136
|
-
else if (applyResult.rejected.length > 0) {
|
|
137
|
-
applyError = `Rejected blocks: ${applyResult.rejected
|
|
138
|
-
.map((r) => `${r.path} (${r.reason})`)
|
|
139
|
-
.join('; ')}`;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
// Verify — only when something was applied; otherwise the tree is
|
|
143
|
-
// unchanged and re-running gates would waste minutes for no signal.
|
|
144
|
-
const filesApplied = applyResult?.filesWritten ?? [];
|
|
145
|
-
let ladder = null;
|
|
146
|
-
if (!executorError && filesApplied.length > 0) {
|
|
147
|
-
ladder = await this.ladderRunner(rungs, this.config.projectRoot, this.config.ladderOptions);
|
|
148
|
-
finalFeedback = ladder.feedback;
|
|
221
|
+
const outcome = this.config.explorer
|
|
222
|
+
? await this.runExplorerTurn(instruction, prompt, rungs, this.config.explorer)
|
|
223
|
+
: await this.runSingleTurn(prompt, rungs);
|
|
224
|
+
finalOutput = outcome.output || finalOutput;
|
|
225
|
+
if (outcome.ladder) {
|
|
226
|
+
finalFeedback = outcome.ladder.feedback;
|
|
149
227
|
}
|
|
150
228
|
const record = {
|
|
151
229
|
turn,
|
|
152
|
-
passed: ladder?.passed ?? false,
|
|
153
|
-
score: ladder?.score ?? 0,
|
|
154
|
-
gateResults: ladder?.results ?? [],
|
|
155
|
-
filesApplied,
|
|
156
|
-
executorError,
|
|
157
|
-
applyError,
|
|
230
|
+
passed: outcome.ladder?.passed ?? false,
|
|
231
|
+
score: outcome.ladder?.score ?? 0,
|
|
232
|
+
gateResults: outcome.ladder?.results ?? [],
|
|
233
|
+
filesApplied: outcome.filesApplied,
|
|
234
|
+
executorError: outcome.executorError,
|
|
235
|
+
applyError: outcome.applyError,
|
|
236
|
+
strategy: outcome.strategy,
|
|
237
|
+
candidates: outcome.candidates,
|
|
238
|
+
judgeRationale: outcome.judgeRationale,
|
|
158
239
|
durationMs: Date.now() - turnStart,
|
|
159
240
|
};
|
|
160
241
|
history.push(record);
|
|
161
242
|
const directive = this.config.onIteration?.(record);
|
|
162
|
-
if (ladder?.passed) {
|
|
243
|
+
if (outcome.ladder?.passed) {
|
|
163
244
|
success = true;
|
|
164
245
|
break;
|
|
165
246
|
}
|
|
166
247
|
if (directive === 'stop') {
|
|
167
248
|
break;
|
|
168
249
|
}
|
|
250
|
+
// Phase 3: structured critique of the failed turn (fail-soft). Skipped
|
|
251
|
+
// on the last turn — prevContext is never consumed, so it would waste
|
|
252
|
+
// a model call.
|
|
253
|
+
let critique;
|
|
254
|
+
if (this.config.critic && !outcome.executorError && turn < maxTurns) {
|
|
255
|
+
try {
|
|
256
|
+
const result = await this.config.critic({
|
|
257
|
+
instruction,
|
|
258
|
+
record,
|
|
259
|
+
feedback: outcome.ladder?.feedback ?? outcome.applyError ?? '',
|
|
260
|
+
attemptOutput: truncateHead(outcome.output, previousOutputChars),
|
|
261
|
+
});
|
|
262
|
+
critique = result.fixList.length > 0 ? result.fixList : undefined;
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
critique = undefined;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
169
268
|
prevContext = {
|
|
170
|
-
previousOutput: executorError
|
|
269
|
+
previousOutput: outcome.executorError
|
|
171
270
|
? undefined
|
|
172
|
-
: truncateHead(output, previousOutputChars),
|
|
173
|
-
feedback: executorError
|
|
174
|
-
|
|
175
|
-
|
|
271
|
+
: truncateHead(outcome.output, previousOutputChars),
|
|
272
|
+
feedback: outcome.executorError
|
|
273
|
+
? `Model call failed: ${outcome.executorError}`
|
|
274
|
+
: outcome.ladder?.feedback,
|
|
275
|
+
applyError: outcome.applyError,
|
|
276
|
+
previousFiles: outcome.filesApplied.length > 0 ? outcome.filesApplied : undefined,
|
|
277
|
+
critique,
|
|
176
278
|
};
|
|
177
279
|
}
|
|
178
280
|
let bestScore = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convergence-loop.js","sourceRoot":"","sources":["../../src/delivery/convergence-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"convergence-loop.js","sourceRoot":"","sources":["../../src/delivery/convergence-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured Critic (Phase 3)
|
|
3
|
+
*
|
|
4
|
+
* Replaces raw gate-output dumps with a decomposed repair plan. After a
|
|
5
|
+
* failed iteration, the critic analyzes the gate feedback through a
|
|
6
|
+
* gate-specific lens and emits a numbered, file-scoped fix list sized for
|
|
7
|
+
* small-model context budgets — one concrete action per line beats a wall
|
|
8
|
+
* of compiler output.
|
|
9
|
+
*/
|
|
10
|
+
import type { LoopExecutor } from './convergence-loop.js';
|
|
11
|
+
import type { IterationRecord } from './convergence-loop.js';
|
|
12
|
+
export interface CritiqueInput {
|
|
13
|
+
instruction: string;
|
|
14
|
+
/** The failed iteration being critiqued */
|
|
15
|
+
record: IterationRecord;
|
|
16
|
+
/** Gate feedback from the ladder (already truncated) */
|
|
17
|
+
feedback: string;
|
|
18
|
+
/** Model output from the failed attempt (already truncated) */
|
|
19
|
+
attemptOutput: string;
|
|
20
|
+
}
|
|
21
|
+
export interface Critique {
|
|
22
|
+
/** Numbered, file-scoped repair steps */
|
|
23
|
+
fixList: string[];
|
|
24
|
+
/** Gate the critique focuses on (first failing required gate) */
|
|
25
|
+
focusGate?: string;
|
|
26
|
+
}
|
|
27
|
+
export type Critic = (input: CritiqueInput) => Promise<Critique>;
|
|
28
|
+
/** Parse numbered lines ("1. ...", "2) ...") out of model output. */
|
|
29
|
+
export declare function parseFixList(text: string): string[];
|
|
30
|
+
/**
|
|
31
|
+
* Model-backed critic. Fail-soft: on executor error or unparseable output
|
|
32
|
+
* it returns an empty fix list, and the loop falls back to raw feedback.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createModelCritic(executor: LoopExecutor): Critic;
|
|
35
|
+
//# sourceMappingURL=critic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"critic.d.ts","sourceRoot":"","sources":["../../src/delivery/critic.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,MAAM,EAAE,eAAe,CAAC;IACxB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,yCAAyC;IACzC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAmDjE,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CASnD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAUhE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured Critic (Phase 3)
|
|
3
|
+
*
|
|
4
|
+
* Replaces raw gate-output dumps with a decomposed repair plan. After a
|
|
5
|
+
* failed iteration, the critic analyzes the gate feedback through a
|
|
6
|
+
* gate-specific lens and emits a numbered, file-scoped fix list sized for
|
|
7
|
+
* small-model context budgets — one concrete action per line beats a wall
|
|
8
|
+
* of compiler output.
|
|
9
|
+
*/
|
|
10
|
+
/** Gate-specific analyst personas — the lens shapes what the critic looks for. */
|
|
11
|
+
const GATE_PERSONAS = {
|
|
12
|
+
build: 'You are a compiler-error analyst. Map each error to its file and the exact change that resolves it.',
|
|
13
|
+
typecheck: 'You are a TypeScript type-system expert. For each type error, state the file, the conflicting types, and the precise fix.',
|
|
14
|
+
test: 'You are a test-failure analyst. For each failing test, state what behavior it expects, which source file implements that behavior, and what must change.',
|
|
15
|
+
lint: 'You are a code-style reviewer. List the mechanical fixes per file.',
|
|
16
|
+
};
|
|
17
|
+
const DEFAULT_PERSONA = 'You are a senior engineer diagnosing why a change failed verification.';
|
|
18
|
+
const MAX_FIX_STEPS = 8;
|
|
19
|
+
function firstFailingGate(record) {
|
|
20
|
+
return record.gateResults.find((g) => !g.passed && !g.skipped)?.id;
|
|
21
|
+
}
|
|
22
|
+
function buildCriticPrompt(input) {
|
|
23
|
+
const gate = firstFailingGate(input.record);
|
|
24
|
+
const persona = (gate && GATE_PERSONAS[gate]) ?? DEFAULT_PERSONA;
|
|
25
|
+
return [
|
|
26
|
+
persona,
|
|
27
|
+
'',
|
|
28
|
+
`TASK BEING ATTEMPTED: ${input.instruction}`,
|
|
29
|
+
'',
|
|
30
|
+
input.record.filesApplied.length > 0
|
|
31
|
+
? `FILES CHANGED BY THE ATTEMPT: ${input.record.filesApplied.join(', ')}`
|
|
32
|
+
: 'THE ATTEMPT CHANGED NO FILES.',
|
|
33
|
+
'',
|
|
34
|
+
'VERIFICATION FEEDBACK:',
|
|
35
|
+
input.feedback,
|
|
36
|
+
'',
|
|
37
|
+
'THE ATTEMPT (truncated):',
|
|
38
|
+
input.attemptOutput,
|
|
39
|
+
'',
|
|
40
|
+
`Produce a repair plan: at most ${MAX_FIX_STEPS} numbered steps, each naming a specific file and a specific change.`,
|
|
41
|
+
'Format strictly as numbered lines ("1. <file>: <change>"). No prose before or after.',
|
|
42
|
+
].join('\n');
|
|
43
|
+
}
|
|
44
|
+
/** Max characters of critic output parsed (bounds work on untrusted text). */
|
|
45
|
+
const MAX_CRITIC_CHARS = 20_000;
|
|
46
|
+
/** Linear, anchored matcher — no overlapping quantifiers (avoids ReDoS). */
|
|
47
|
+
const FIX_LINE_RE = /^\s{0,8}(\d{1,3})[.)]\s+(\S[^\n]*?)\s*$/;
|
|
48
|
+
/** Parse numbered lines ("1. ...", "2) ...") out of model output. */
|
|
49
|
+
export function parseFixList(text) {
|
|
50
|
+
const steps = [];
|
|
51
|
+
const bounded = text.length > MAX_CRITIC_CHARS ? text.slice(0, MAX_CRITIC_CHARS) : text;
|
|
52
|
+
for (const line of bounded.split('\n')) {
|
|
53
|
+
const match = FIX_LINE_RE.exec(line);
|
|
54
|
+
if (match)
|
|
55
|
+
steps.push(match[2]);
|
|
56
|
+
if (steps.length >= MAX_FIX_STEPS)
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
return steps;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Model-backed critic. Fail-soft: on executor error or unparseable output
|
|
63
|
+
* it returns an empty fix list, and the loop falls back to raw feedback.
|
|
64
|
+
*/
|
|
65
|
+
export function createModelCritic(executor) {
|
|
66
|
+
return async (input) => {
|
|
67
|
+
const focusGate = firstFailingGate(input.record);
|
|
68
|
+
try {
|
|
69
|
+
const raw = await executor(buildCriticPrompt(input));
|
|
70
|
+
return { fixList: parseFixList(raw), focusGate };
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return { fixList: [], focusGate };
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=critic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"critic.js","sourceRoot":"","sources":["../../src/delivery/critic.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwBH,kFAAkF;AAClF,MAAM,aAAa,GAA2B;IAC5C,KAAK,EACH,qGAAqG;IACvG,SAAS,EACP,2HAA2H;IAC7H,IAAI,EACF,0JAA0J;IAC5J,IAAI,EAAE,oEAAoE;CAC3E,CAAC;AAEF,MAAM,eAAe,GACnB,wEAAwE,CAAC;AAE3E,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,SAAS,gBAAgB,CAAC,MAAuB;IAC/C,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAoB;IAC7C,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,eAAe,CAAC;IAEjE,OAAO;QACL,OAAO;QACP,EAAE;QACF,yBAAyB,KAAK,CAAC,WAAW,EAAE;QAC5C,EAAE;QACF,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAClC,CAAC,CAAC,iCAAiC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACzE,CAAC,CAAC,+BAA+B;QACnC,EAAE;QACF,wBAAwB;QACxB,KAAK,CAAC,QAAQ;QACd,EAAE;QACF,0BAA0B;QAC1B,KAAK,CAAC,aAAa;QACnB,EAAE;QACF,kCAAkC,aAAa,qEAAqE;QACpH,sFAAsF;KACvF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,4EAA4E;AAC5E,MAAM,WAAW,GAAG,yCAAyC,CAAC;AAE9D,qEAAqE;AACrE,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxF,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,MAAM,IAAI,aAAa;YAAE,MAAM;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAsB;IACtD,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|