@miller-tech/uap 1.27.0 → 1.29.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 (40) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/bin/cli.js +5 -0
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/cli/deliver.d.ts +5 -0
  5. package/dist/cli/deliver.d.ts.map +1 -1
  6. package/dist/cli/deliver.js +91 -10
  7. package/dist/cli/deliver.js.map +1 -1
  8. package/dist/delivery/applier.d.ts +11 -0
  9. package/dist/delivery/applier.d.ts.map +1 -1
  10. package/dist/delivery/applier.js +189 -6
  11. package/dist/delivery/applier.js.map +1 -1
  12. package/dist/delivery/convergence-loop.d.ts +75 -13
  13. package/dist/delivery/convergence-loop.d.ts.map +1 -1
  14. package/dist/delivery/convergence-loop.js +209 -58
  15. package/dist/delivery/convergence-loop.js.map +1 -1
  16. package/dist/delivery/critic.d.ts +35 -0
  17. package/dist/delivery/critic.d.ts.map +1 -0
  18. package/dist/delivery/critic.js +77 -0
  19. package/dist/delivery/critic.js.map +1 -0
  20. package/dist/delivery/escalation.d.ts +66 -0
  21. package/dist/delivery/escalation.d.ts.map +1 -0
  22. package/dist/delivery/escalation.js +84 -0
  23. package/dist/delivery/escalation.js.map +1 -0
  24. package/dist/delivery/explorer.d.ts +77 -0
  25. package/dist/delivery/explorer.d.ts.map +1 -0
  26. package/dist/delivery/explorer.js +166 -0
  27. package/dist/delivery/explorer.js.map +1 -0
  28. package/dist/delivery/index.d.ts +7 -2
  29. package/dist/delivery/index.d.ts.map +1 -1
  30. package/dist/delivery/index.js +6 -1
  31. package/dist/delivery/index.js.map +1 -1
  32. package/dist/delivery/judge.d.ts +33 -0
  33. package/dist/delivery/judge.d.ts.map +1 -0
  34. package/dist/delivery/judge.js +70 -0
  35. package/dist/delivery/judge.js.map +1 -0
  36. package/dist/delivery/practice.d.ts +72 -0
  37. package/dist/delivery/practice.d.ts.map +1 -0
  38. package/dist/delivery/practice.js +185 -0
  39. package/dist/delivery/practice.js.map +1 -0
  40. package/package.json +1 -1
@@ -1,21 +1,22 @@
1
1
  /**
2
2
  * Convergence Loop
3
3
  *
4
- * Phase 1 of the Fable-parity delivery harness: drives an underlying model
5
- * through execute apply verify feedback iterations until the project's
6
- * completion gates (verifier ladder) pass or the turn budget is exhausted.
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 four pluggable seams so later phases extend without breaking
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/prior output compose a prompt
13
- * (Phase 3 structured critique and Phase 4 memory injection plug in here)
14
- * - ladderRunner: how gates are verified (tests inject stubs; Phase 2 runs
15
- * candidates in isolated worktrees)
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 = [
@@ -34,12 +35,28 @@ function truncateHead(text, maxChars) {
34
35
  return text;
35
36
  return `${text.slice(0, maxChars)}\n…(truncated)…`;
36
37
  }
38
+ /** Coerce the onIteration return (void | 'stop' | directive) to a directive. */
39
+ function normalizeDirective(value) {
40
+ if (value === 'stop')
41
+ return { stop: true };
42
+ if (!value)
43
+ return {};
44
+ return value;
45
+ }
46
+ /** Render retrieved best-practice cards as a prompt section. */
47
+ function practiceSection(practices) {
48
+ if (!practices || practices.length === 0)
49
+ return [];
50
+ const lines = ['', 'PROVEN PRACTICES for tasks like this — follow them:'];
51
+ practices.forEach((p, i) => lines.push(`${i + 1}. ${p}`));
52
+ return lines;
53
+ }
37
54
  /** Default prompt strategy: lean contract + structured retry context. */
38
55
  export const defaultPromptBuilder = (ctx) => {
39
56
  if (ctx.turn === 1) {
40
- return [OUTPUT_CONTRACT, '', `TASK: ${ctx.instruction}`].join('\n');
57
+ return [OUTPUT_CONTRACT, ...practiceSection(ctx.practices), '', `TASK: ${ctx.instruction}`].join('\n');
41
58
  }
42
- const sections = [OUTPUT_CONTRACT, '', `TASK: ${ctx.instruction}`, ''];
59
+ const sections = [OUTPUT_CONTRACT, ...practiceSection(ctx.practices), '', `TASK: ${ctx.instruction}`, ''];
43
60
  sections.push(`PREVIOUS ATTEMPT (turn ${ctx.turn - 1}):`);
44
61
  if (ctx.previousFiles && ctx.previousFiles.length > 0) {
45
62
  sections.push(`Files you emitted: ${ctx.previousFiles.join(', ')}`);
@@ -47,7 +64,15 @@ export const defaultPromptBuilder = (ctx) => {
47
64
  if (ctx.applyError) {
48
65
  sections.push(`Your output could not be applied: ${ctx.applyError}`);
49
66
  }
67
+ // A structured repair plan outranks the raw gate dump: one concrete action
68
+ // per line is what small models can actually execute.
69
+ if (ctx.critique && ctx.critique.length > 0) {
70
+ sections.push('');
71
+ sections.push('REPAIR PLAN — apply these fixes exactly:');
72
+ ctx.critique.forEach((step, i) => sections.push(`${i + 1}. ${step}`));
73
+ }
50
74
  if (ctx.feedback) {
75
+ sections.push('');
51
76
  sections.push(ctx.feedback);
52
77
  }
53
78
  if (ctx.previousOutput) {
@@ -72,6 +97,100 @@ export class ConvergenceLoop {
72
97
  this.applier = seams.applier ?? applyFileBlocks;
73
98
  this.promptBuilder = seams.promptBuilder ?? defaultPromptBuilder;
74
99
  }
100
+ /** Single-candidate turn: execute → apply → verify. */
101
+ async runSingleTurn(prompt, rungs, executor) {
102
+ let output = '';
103
+ let executorError;
104
+ try {
105
+ output = await executor(prompt);
106
+ }
107
+ catch (err) {
108
+ executorError = err instanceof Error ? err.message : String(err);
109
+ }
110
+ let applyResult = null;
111
+ let applyError;
112
+ if (!executorError) {
113
+ applyResult = await this.applier(output, this.config.projectRoot);
114
+ if (applyResult.error) {
115
+ applyError = applyResult.error;
116
+ }
117
+ else if (applyResult.rejected.length > 0) {
118
+ applyError = `Rejected blocks: ${applyResult.rejected
119
+ .map((r) => `${r.path} (${r.reason})`)
120
+ .join('; ')}`;
121
+ }
122
+ }
123
+ // Verify — only when something was applied; otherwise the tree is
124
+ // unchanged and re-running gates would waste minutes for no signal.
125
+ const filesApplied = applyResult?.filesWritten ?? [];
126
+ let ladder = null;
127
+ if (!executorError && filesApplied.length > 0) {
128
+ ladder = await this.ladderRunner(rungs, this.config.projectRoot, this.config.ladderOptions);
129
+ }
130
+ return { output, filesApplied, ladder, executorError, applyError };
131
+ }
132
+ /** Explorer turn: best-of-N candidates, commit the winner (Phase 2). */
133
+ async runExplorerTurn(instruction, prompt, rungs, settings, executor) {
134
+ const exploration = await exploreAndCommit(instruction, prompt, executor, {
135
+ candidates: settings.candidates,
136
+ seeds: settings.seeds,
137
+ judge: settings.judge,
138
+ projectRoot: this.config.projectRoot,
139
+ rungs,
140
+ ladderOptions: this.config.ladderOptions,
141
+ ladderRunner: this.ladderRunner,
142
+ });
143
+ const summaries = exploration.candidates.map((c) => ({
144
+ id: c.id,
145
+ strategy: c.strategy,
146
+ passed: c.passed,
147
+ score: c.score,
148
+ error: c.error,
149
+ }));
150
+ const winner = exploration.winner;
151
+ if (!winner) {
152
+ // Distinguish executor failure (no usable model output) from apply
153
+ // failure (output produced but no file blocks) so the retry prompt
154
+ // carries the right guidance — matching single-turn feedback quality.
155
+ const execErrors = exploration.candidates.map((c) => c.error).filter(Boolean);
156
+ if (execErrors.length === exploration.candidates.length && execErrors.length > 0) {
157
+ return {
158
+ output: '',
159
+ filesApplied: [],
160
+ ladder: null,
161
+ executorError: execErrors.join('; '),
162
+ candidates: summaries,
163
+ };
164
+ }
165
+ const applyErr = exploration.candidates.map((c) => c.applyResult?.error).find(Boolean) ??
166
+ 'No candidate produced applicable file blocks.';
167
+ return {
168
+ output: '',
169
+ filesApplied: [],
170
+ ladder: null,
171
+ applyError: applyErr,
172
+ candidates: summaries,
173
+ };
174
+ }
175
+ let applyError;
176
+ if (winner.applyResult?.error) {
177
+ applyError = winner.applyResult.error;
178
+ }
179
+ else if (winner.applyResult && winner.applyResult.rejected.length > 0) {
180
+ applyError = `Rejected blocks: ${winner.applyResult.rejected
181
+ .map((r) => `${r.path} (${r.reason})`)
182
+ .join('; ')}`;
183
+ }
184
+ return {
185
+ output: winner.output,
186
+ filesApplied: winner.applyResult?.filesWritten ?? [],
187
+ ladder: exploration.ladder,
188
+ applyError,
189
+ strategy: winner.strategy,
190
+ candidates: summaries,
191
+ judgeRationale: exploration.judgeRationale,
192
+ };
193
+ }
75
194
  /**
76
195
  * Run the loop for an instruction until all required gates pass or the
77
196
  * turn budget is exhausted. Returns the full iteration history so callers
@@ -79,16 +198,21 @@ export class ConvergenceLoop {
79
198
  */
80
199
  async deliver(instruction) {
81
200
  const start = Date.now();
82
- const maxTurns = this.config.maxTurns ?? DEFAULT_MAX_TURNS;
83
201
  const rungs = this.config.rungs && this.config.rungs.length > 0
84
202
  ? this.config.rungs
85
203
  : detectRungs(this.config.projectRoot);
86
204
  if (rungs.length === 0) {
87
205
  throw new Error(`No verifiable gates for ${this.config.projectRoot} — pass explicit rungs or add package.json scripts.`);
88
206
  }
207
+ // Mutable run-state — a Phase 5 escalation directive can raise the budget,
208
+ // switch the model, enable exploration, or turn on the critic mid-run.
209
+ let maxTurns = this.config.maxTurns ?? DEFAULT_MAX_TURNS;
89
210
  if (!Number.isInteger(maxTurns) || maxTurns < 1) {
90
211
  throw new Error(`maxTurns must be a positive integer, got ${String(this.config.maxTurns)}`);
91
212
  }
213
+ let executor = this.executor;
214
+ let explorerSettings = this.config.explorer;
215
+ let critic = this.config.critic;
92
216
  const history = [];
93
217
  const previousOutputChars = this.config.previousOutputChars ?? DEFAULT_PREVIOUS_OUTPUT_CHARS;
94
218
  // Baseline: a green tree means there is nothing for the loop to deliver.
@@ -108,71 +232,98 @@ export class ConvergenceLoop {
108
232
  };
109
233
  }
110
234
  }
235
+ // Phase 4: retrieve best-practice cards once — they are task-level and
236
+ // stable across turns. Fail-soft so retrieval never blocks delivery.
237
+ let practices;
238
+ if (this.config.practiceProvider) {
239
+ try {
240
+ const fetched = await this.config.practiceProvider(instruction);
241
+ practices = fetched.length > 0 ? fetched : undefined;
242
+ }
243
+ catch {
244
+ practices = undefined;
245
+ }
246
+ }
111
247
  let success = false;
112
248
  let finalOutput = '';
113
249
  let finalFeedback = '';
114
- let prevContext = {};
250
+ let prevContext = { practices };
115
251
  for (let turn = 1; turn <= maxTurns; turn++) {
116
252
  const turnStart = Date.now();
117
253
  const prompt = this.promptBuilder({ instruction, turn, ...prevContext });
118
- // Execute
119
- let output = '';
120
- let executorError;
121
- try {
122
- output = await this.executor(prompt);
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;
254
+ const outcome = explorerSettings
255
+ ? await this.runExplorerTurn(instruction, prompt, rungs, explorerSettings, executor)
256
+ : await this.runSingleTurn(prompt, rungs, executor);
257
+ finalOutput = outcome.output || finalOutput;
258
+ if (outcome.ladder) {
259
+ finalFeedback = outcome.ladder.feedback;
149
260
  }
150
261
  const record = {
151
262
  turn,
152
- passed: ladder?.passed ?? false,
153
- score: ladder?.score ?? 0,
154
- gateResults: ladder?.results ?? [],
155
- filesApplied,
156
- executorError,
157
- applyError,
263
+ passed: outcome.ladder?.passed ?? false,
264
+ score: outcome.ladder?.score ?? 0,
265
+ gateResults: outcome.ladder?.results ?? [],
266
+ filesApplied: outcome.filesApplied,
267
+ executorError: outcome.executorError,
268
+ applyError: outcome.applyError,
269
+ strategy: outcome.strategy,
270
+ candidates: outcome.candidates,
271
+ judgeRationale: outcome.judgeRationale,
158
272
  durationMs: Date.now() - turnStart,
159
273
  };
160
274
  history.push(record);
161
- const directive = this.config.onIteration?.(record);
162
- if (ladder?.passed) {
275
+ if (outcome.ladder?.passed) {
163
276
  success = true;
277
+ this.config.onIteration?.(record);
164
278
  break;
165
279
  }
166
- if (directive === 'stop') {
280
+ const directive = normalizeDirective(this.config.onIteration?.(record));
281
+ if (directive.stop) {
167
282
  break;
168
283
  }
284
+ // Apply escalation directives to the run-state for subsequent turns
285
+ if (directive.switchExecutor) {
286
+ executor = directive.switchExecutor;
287
+ }
288
+ if (typeof directive.setCandidates === 'number') {
289
+ explorerSettings = { ...(explorerSettings ?? {}), candidates: directive.setCandidates };
290
+ }
291
+ if (directive.enableCritic && !critic && this.config.criticFactory) {
292
+ // Bind to the current (possibly just-switched) executor, not the base.
293
+ critic = this.config.criticFactory(executor);
294
+ }
295
+ if (typeof directive.raiseMaxTurns === 'number' && directive.raiseMaxTurns > maxTurns) {
296
+ maxTurns = directive.raiseMaxTurns;
297
+ }
298
+ // Phase 3: structured critique of the failed turn (fail-soft). Skipped
299
+ // on the last turn — prevContext is never consumed, so it would waste
300
+ // a model call.
301
+ let critique;
302
+ if (critic && !outcome.executorError && turn < maxTurns) {
303
+ try {
304
+ const result = await critic({
305
+ instruction,
306
+ record,
307
+ feedback: outcome.ladder?.feedback ?? outcome.applyError ?? '',
308
+ attemptOutput: truncateHead(outcome.output, previousOutputChars),
309
+ });
310
+ critique = result.fixList.length > 0 ? result.fixList : undefined;
311
+ }
312
+ catch {
313
+ critique = undefined;
314
+ }
315
+ }
169
316
  prevContext = {
170
- previousOutput: executorError
317
+ previousOutput: outcome.executorError
171
318
  ? undefined
172
- : truncateHead(output, previousOutputChars),
173
- feedback: executorError ? `Model call failed: ${executorError}` : ladder?.feedback,
174
- applyError,
175
- previousFiles: filesApplied.length > 0 ? filesApplied : undefined,
319
+ : truncateHead(outcome.output, previousOutputChars),
320
+ feedback: outcome.executorError
321
+ ? `Model call failed: ${outcome.executorError}`
322
+ : outcome.ladder?.feedback,
323
+ applyError: outcome.applyError,
324
+ previousFiles: outcome.filesApplied.length > 0 ? outcome.filesApplied : undefined,
325
+ critique,
326
+ practices,
176
327
  };
177
328
  }
178
329
  let bestScore = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"convergence-loop.js","sourceRoot":"","sources":["../../src/delivery/convergence-loop.ts"],"names":[],"mappings":"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"}
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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Escalation Controller (Phase 5)
3
+ *
4
+ * An onIteration handler that watches for stagnation and climbs an escalation
5
+ * ladder: when the best gate score stops improving for N consecutive turns,
6
+ * advance to the next tier. Tiers escalate cost progressively — widen
7
+ * exploration, enable the critic, raise the turn budget, and finally switch to
8
+ * a stronger model — so cheap strategies are exhausted before expensive ones.
9
+ *
10
+ * The controller is pure policy: it inspects IterationRecords and returns
11
+ * directives. The loop owns all mutation. This keeps escalation testable in
12
+ * isolation and swappable without touching the loop.
13
+ */
14
+ import type { IterationRecord, IterationDirective, LoopExecutor } from './convergence-loop.js';
15
+ export interface EscalationTier {
16
+ /** Label surfaced in directive notes and logs */
17
+ label: string;
18
+ /** Widen best-of-N exploration to this many candidates */
19
+ setCandidates?: number;
20
+ /** Turn the structured critic on */
21
+ enableCritic?: boolean;
22
+ /** Raise the absolute turn budget */
23
+ raiseMaxTurns?: number;
24
+ /** Escalate to a stronger model */
25
+ switchExecutor?: LoopExecutor;
26
+ }
27
+ export interface EscalationConfig {
28
+ tiers: EscalationTier[];
29
+ /**
30
+ * Consecutive non-improving turns that trigger advancing one tier
31
+ * (default 2). A turn "improves" if its score exceeds the best seen so far.
32
+ */
33
+ stagnationTurns?: number;
34
+ /** Minimum score delta to count as improvement (default 0.01) */
35
+ improvementEpsilon?: number;
36
+ /** Called whenever a tier is applied (telemetry/logging) */
37
+ onEscalate?: (tier: EscalationTier, turn: number) => void;
38
+ }
39
+ export interface EscalationController {
40
+ onIteration: (record: IterationRecord) => IterationDirective;
41
+ /** Index of the next tier to apply (for inspection/tests) */
42
+ tierIndex(): number;
43
+ }
44
+ export interface DefaultLadderOptions {
45
+ /** Candidates to widen exploration to on the first escalation (default 3) */
46
+ candidates?: number;
47
+ /** Current turn budget; the model-switch tier raises it by +2 */
48
+ maxTurns?: number;
49
+ /** A stronger model executor; when present, adds a final model-switch tier */
50
+ escalateExecutor?: LoopExecutor;
51
+ /** Display name for the stronger model (for the tier label) */
52
+ escalateModelName?: string;
53
+ }
54
+ /**
55
+ * The canonical escalation ladder: exhaust cheap strategies before expensive
56
+ * ones — widen exploration, then enable the critic, then (if configured)
57
+ * switch to a stronger model with a couple extra turns. Library-owned so
58
+ * non-CLI callers get the same policy.
59
+ */
60
+ export declare function defaultEscalationLadder(options?: DefaultLadderOptions): EscalationTier[];
61
+ /**
62
+ * Build a stagnation-driven escalation controller. Returns an `onIteration`
63
+ * suitable for ConvergenceConfig, plus a `tierIndex` accessor for tests.
64
+ */
65
+ export declare function createEscalationController(config: EscalationConfig): EscalationController;
66
+ //# sourceMappingURL=escalation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escalation.d.ts","sourceRoot":"","sources":["../../src/delivery/escalation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE/F,MAAM,WAAW,cAAc;IAC7B,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,cAAc,CAAC,EAAE,YAAY,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,kBAAkB,CAAC;IAC7D,6DAA6D;IAC7D,SAAS,IAAI,MAAM,CAAC;CACrB;AAKD,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,oBAAyB,GAAG,cAAc,EAAE,CAc5F;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,gBAAgB,GAAG,oBAAoB,CA8CzF"}