planpong 0.5.7 → 0.6.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 (61) hide show
  1. package/README.md +47 -10
  2. package/dist/bin/planpong.js +3 -0
  3. package/dist/bin/planpong.js.map +1 -1
  4. package/dist/src/cli/commands/init.d.ts +53 -0
  5. package/dist/src/cli/commands/init.js +221 -0
  6. package/dist/src/cli/commands/init.js.map +1 -0
  7. package/dist/src/cli/ui.js +11 -19
  8. package/dist/src/cli/ui.js.map +1 -1
  9. package/dist/src/config/loader.d.ts +5 -0
  10. package/dist/src/config/loader.js +21 -1
  11. package/dist/src/config/loader.js.map +1 -1
  12. package/dist/src/config/mutate.d.ts +26 -0
  13. package/dist/src/config/mutate.js +45 -32
  14. package/dist/src/config/mutate.js.map +1 -1
  15. package/dist/src/core/convergence.js +1 -1
  16. package/dist/src/core/convergence.js.map +1 -1
  17. package/dist/src/core/operations.d.ts +44 -1
  18. package/dist/src/core/operations.js +110 -37
  19. package/dist/src/core/operations.js.map +1 -1
  20. package/dist/src/core/presentation.d.ts +39 -0
  21. package/dist/src/core/presentation.js +132 -0
  22. package/dist/src/core/presentation.js.map +1 -0
  23. package/dist/src/core/round-state.d.ts +15 -0
  24. package/dist/src/core/round-state.js +49 -0
  25. package/dist/src/core/round-state.js.map +1 -0
  26. package/dist/src/core/session.d.ts +1 -0
  27. package/dist/src/core/session.js +60 -1
  28. package/dist/src/core/session.js.map +1 -1
  29. package/dist/src/mcp/server.js +6 -6
  30. package/dist/src/mcp/server.js.map +1 -1
  31. package/dist/src/mcp/tools/get-feedback.d.ts +1 -2
  32. package/dist/src/mcp/tools/get-feedback.js +154 -56
  33. package/dist/src/mcp/tools/get-feedback.js.map +1 -1
  34. package/dist/src/mcp/tools/record-revision.d.ts +0 -6
  35. package/dist/src/mcp/tools/record-revision.js +170 -95
  36. package/dist/src/mcp/tools/record-revision.js.map +1 -1
  37. package/dist/src/mcp/tools/revise.d.ts +1 -7
  38. package/dist/src/mcp/tools/revise.js +126 -90
  39. package/dist/src/mcp/tools/revise.js.map +1 -1
  40. package/dist/src/mcp/tools/status.js +18 -1
  41. package/dist/src/mcp/tools/status.js.map +1 -1
  42. package/dist/src/providers/claude.d.ts +22 -1
  43. package/dist/src/providers/claude.js +10 -10
  44. package/dist/src/providers/claude.js.map +1 -1
  45. package/dist/src/providers/codex.d.ts +12 -1
  46. package/dist/src/providers/codex.js +6 -3
  47. package/dist/src/providers/codex.js.map +1 -1
  48. package/dist/src/providers/gemini.d.ts +58 -0
  49. package/dist/src/providers/gemini.js +169 -0
  50. package/dist/src/providers/gemini.js.map +1 -0
  51. package/dist/src/providers/registry.js +7 -1
  52. package/dist/src/providers/registry.js.map +1 -1
  53. package/dist/src/providers/shared.d.ts +16 -0
  54. package/dist/src/providers/shared.js +22 -0
  55. package/dist/src/providers/shared.js.map +1 -0
  56. package/dist/src/providers/types.d.ts +1 -1
  57. package/dist/src/schemas/metrics.d.ts +14 -14
  58. package/dist/src/schemas/metrics.js +13 -2
  59. package/dist/src/schemas/metrics.js.map +1 -1
  60. package/dist/src/schemas/session.d.ts +2 -2
  61. package/package.json +3 -2
@@ -57,48 +57,56 @@ function getNestedValue(obj, key) {
57
57
  }
58
58
  return current;
59
59
  }
60
- export function setConfigValue(cwd, key, rawValue, opts) {
61
- if (!isValidKey(key)) {
62
- throw new Error(`Unknown config key: "${key}". Valid keys: ${VALID_KEYS.join(", ")}`);
60
+ /**
61
+ * Apply many key/value picks to the project's planpong.yaml in one atomic
62
+ * write. Validates every pick (key allowlist, type coercion, merged-config
63
+ * schema) before any disk mutation, so a failing pick aborts the entire
64
+ * batch with the on-disk file byte-identical to its prior state.
65
+ *
66
+ * The single-key `setConfigValue` is a thin wrapper over this; the wizard
67
+ * flow calls this directly with all picks accumulated in memory.
68
+ */
69
+ export function setConfigValuesBatch(cwd, picks, opts) {
70
+ for (const p of picks) {
71
+ if (!isValidKey(p.key)) {
72
+ throw new Error(`Unknown config key: "${p.key}". Valid keys: ${VALID_KEYS.join(", ")}`);
73
+ }
63
74
  }
64
- const value = coerceValue(key, rawValue);
65
75
  const existingPath = findConfigPath(cwd);
66
76
  const configPath = existingPath ?? join(cwd, "planpong.yaml");
67
77
  const created = !existingPath;
78
+ if (picks.length === 0) {
79
+ return { configPath, created: false, results: [] };
80
+ }
68
81
  const raw = existingPath ? readFileSync(existingPath, "utf-8") : "";
69
82
  const doc = parseDocument(raw);
70
- const parts = key.split(".");
71
- const before = getNestedValue(doc.toJSON() ?? {}, key);
72
- if (parts.length === 1) {
73
- doc.set(parts[0], value);
74
- }
75
- else {
76
- let node = doc.get(parts[0], true);
77
- if (node == null || typeof node !== "object" || !("set" in node)) {
78
- doc.set(parts[0], { [parts[1]]: value });
83
+ const beforeJson = doc.toJSON() ?? {};
84
+ const testConfig = { ...loadConfig({ cwd }).valueOf() };
85
+ const results = [];
86
+ for (const p of picks) {
87
+ const value = coerceValue(p.key, p.rawValue);
88
+ const before = getNestedValue(beforeJson, p.key);
89
+ results.push({ key: p.key, before, after: value });
90
+ const parts = p.key.split(".");
91
+ doc.setIn(parts, value);
92
+ if (parts.length === 1) {
93
+ testConfig[parts[0]] = value;
79
94
  }
80
95
  else {
81
- node.set(parts[1], value);
96
+ const section = testConfig[parts[0]] ?? {};
97
+ section[parts[1]] = value;
98
+ testConfig[parts[0]] = section;
82
99
  }
83
100
  }
84
- // Validate the full merged config would be valid
85
- const merged = doc.toJSON();
86
- const testConfig = { ...loadConfig({ cwd }).valueOf() };
87
- if (parts.length === 1) {
88
- testConfig[parts[0]] = value;
89
- }
90
- else {
91
- const section = testConfig[parts[0]] ?? {};
92
- section[parts[1]] = value;
93
- testConfig[parts[0]] = section;
94
- }
95
101
  try {
96
102
  PlanpongConfigSchema.parse(testConfig);
97
103
  }
98
104
  catch (err) {
99
105
  if (err instanceof ZodError) {
100
- const msg = err.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
101
- throw new Error(`Invalid value for "${key}": ${msg}`);
106
+ const msg = err.issues
107
+ .map((i) => `${i.path.join(".")}: ${i.message}`)
108
+ .join("; ");
109
+ throw new Error(`Invalid value for batch: ${msg}`);
102
110
  }
103
111
  throw err;
104
112
  }
@@ -108,12 +116,17 @@ export function setConfigValue(cwd, key, rawValue, opts) {
108
116
  writeFileSync(tmpPath, output, "utf-8");
109
117
  renameSync(tmpPath, configPath);
110
118
  }
119
+ return { configPath, created, results };
120
+ }
121
+ export function setConfigValue(cwd, key, rawValue, opts) {
122
+ const batch = setConfigValuesBatch(cwd, [{ key, rawValue }], opts);
123
+ const r = batch.results[0];
111
124
  return {
112
- configPath,
113
- key,
114
- before,
115
- after: value,
116
- created,
125
+ configPath: batch.configPath,
126
+ key: r.key,
127
+ before: r.before,
128
+ after: r.after,
129
+ created: batch.created,
117
130
  };
118
131
  }
119
132
  //# sourceMappingURL=mutate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mutate.js","sourceRoot":"","sources":["../../../src/config/mutate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mutate.js","sourceRoot":"","sources":["../../../src/config/mutate.ts"],"names":[],"mappings":"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"}
@@ -195,7 +195,7 @@ export function parseStructuredFeedbackForPhase(content, phase, planText = "") {
195
195
  if (!result.success) {
196
196
  throw new ZodValidationError(`Structured output failed Zod validation for ${phase} phase: ${result.error.message}`, result.error);
197
197
  }
198
- // Apply blocked rationale validation (same rules as legacy path)
198
+ // Apply blocked rationale validation (same rules as prompted path)
199
199
  let feedback = result.data;
200
200
  if (phase === "direction" && feedback.verdict === "blocked") {
201
201
  const direction = feedback;
@@ -1 +1 @@
1
- {"version":3,"file":"convergence.js","sourceRoot":"","sources":["../../../src/core/convergence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convergence.js","sourceRoot":"","sources":["../../../src/core/convergence.ts"],"names":[],"mappings":"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"}
@@ -64,12 +64,13 @@ export interface SessionStats {
64
64
  }
65
65
  export declare function computeSessionStats(cwd: string, sessionId: string, currentRound: number): SessionStats;
66
66
  export declare function formatPhaseExtras(phase: ReturnType<typeof getReviewPhase>, extras: PhaseExtras): string;
67
+ export declare function phaseExtrasFromFeedback(phase: ReturnType<typeof getReviewPhase>, feedback: PhaseFeedback): PhaseExtras;
67
68
  export declare function buildStatusLine(session: Session, config: PlanpongConfig, issueTrajectory: RoundSeverity[], accepted: number, rejected: number, deferred: number, linesAdded: number, linesRemoved: number, elapsed: number, phaseExtras?: PhaseExtras): string;
68
69
  /**
69
70
  * Build and write the status line to the plan file.
70
71
  * Used by both CLI and MCP paths after each round.
71
72
  */
72
- export declare function writeStatusLineToPlan(session: Session, cwd: string, config: PlanpongConfig, suffix?: string): string;
73
+ export declare function writeStatusLineToPlan(session: Session, cwd: string, config: PlanpongConfig, suffix?: string, phaseExtras?: PhaseExtras): string;
73
74
  export declare function updatePlanStatusLine(planContent: string, statusLine: string): string;
74
75
  /**
75
76
  * Initialize a review session for an existing plan file.
@@ -81,6 +82,48 @@ export declare function initReviewSession(planPath: string, cwd: string, config:
81
82
  * Run a single review round: send current plan to the reviewer for critique.
82
83
  */
83
84
  export declare function runReviewRound(session: Session, cwd: string, config: PlanpongConfig, reviewerProvider: Provider): Promise<ReviewRoundResult>;
85
+ export interface FinalizeFeedbackInput {
86
+ session: Session;
87
+ cwd: string;
88
+ round: number;
89
+ feedback: PhaseFeedback;
90
+ /** True when the reviewer session was already established before this round. */
91
+ reviewerSessionInited: boolean;
92
+ /** Captured reviewer session/thread ID from this round's invocation. */
93
+ capturedSessionId?: string;
94
+ }
95
+ export interface FinalizeFeedbackResult {
96
+ feedback: PhaseFeedback;
97
+ /**
98
+ * `true` when this call wrote artifacts; `false` when an existing
99
+ * `round-N-feedback.json` was detected and finalization was a no-op.
100
+ * The first writer wins; subsequent calls return the existing feedback
101
+ * without re-writing.
102
+ */
103
+ fresh: boolean;
104
+ }
105
+ /**
106
+ * Persist review-round artifacts: feedback file, reviewer session ID
107
+ * promotion, blocked-status update, and session.json commit. Mirrors
108
+ * `finalizeRevision` so review and revision rounds share idempotency
109
+ * semantics.
110
+ *
111
+ * Write ordering:
112
+ * 1. `round-N-feedback.json` — the reviewer payload
113
+ * 2. `session.reviewerSessionId` / `reviewerSessionInitialized` (if first round)
114
+ * 3. `session.status = "blocked"` (when verdict === "blocked")
115
+ * 4. `session.json` — single write covering 2+3 (commit point)
116
+ *
117
+ * Idempotency: if `round-N-feedback.json` already exists, returns the
118
+ * existing feedback with `fresh: false`. Tool-level checks in
119
+ * `planpong_get_feedback` are the primary replay path; this helper is the
120
+ * operation-level safety net.
121
+ *
122
+ * **Round advancement is NOT performed here.** `currentRound` is owned by
123
+ * the callers driving the loop (MCP get-feedback, CLI loop). Moving it
124
+ * here would double-advance in MCP mode.
125
+ */
126
+ export declare function finalizeFeedback({ session, cwd, round, feedback, reviewerSessionInited, capturedSessionId, }: FinalizeFeedbackInput): FinalizeFeedbackResult;
84
127
  /**
85
128
  * Run a single revision round: send plan + feedback to the planner for revision.
86
129
  */
@@ -123,6 +123,22 @@ export function formatPhaseExtras(phase, extras) {
123
123
  }
124
124
  return parts.join(" | ");
125
125
  }
126
+ export function phaseExtrasFromFeedback(phase, feedback) {
127
+ const phaseExtras = {};
128
+ if (feedback.verdict === "blocked") {
129
+ phaseExtras.is_blocked = true;
130
+ }
131
+ if (phase === "direction" && "confidence" in feedback) {
132
+ phaseExtras.confidence = feedback.confidence;
133
+ }
134
+ if (phase === "risk" && "risk_level" in feedback) {
135
+ const riskFb = feedback;
136
+ phaseExtras.risk_level = riskFb.risk_level;
137
+ phaseExtras.risk_count = riskFb.risks?.length ?? 0;
138
+ phaseExtras.risks_promoted = feedback.issues.length;
139
+ }
140
+ return phaseExtras;
141
+ }
126
142
  export function buildStatusLine(session, config, issueTrajectory, accepted, rejected, deferred, linesAdded, linesRemoved, elapsed, phaseExtras) {
127
143
  const plannerLabel = formatProviderLabel(config.planner);
128
144
  const reviewerLabel = formatProviderLabel(config.reviewer);
@@ -149,7 +165,7 @@ export function buildStatusLine(session, config, issueTrajectory, accepted, reje
149
165
  * Build and write the status line to the plan file.
150
166
  * Used by both CLI and MCP paths after each round.
151
167
  */
152
- export function writeStatusLineToPlan(session, cwd, config, suffix) {
168
+ export function writeStatusLineToPlan(session, cwd, config, suffix, phaseExtras) {
153
169
  const planPath = resolve(cwd, session.planPath);
154
170
  let planContent = readFileSync(planPath, "utf-8");
155
171
  const stats = computeSessionStats(cwd, session.id, session.currentRound);
@@ -158,7 +174,7 @@ export function writeStatusLineToPlan(session, cwd, config, suffix) {
158
174
  const initialLines = session.initialLineCount ?? currentLines;
159
175
  const linesAdded = Math.max(0, currentLines - initialLines);
160
176
  const linesRemoved = Math.max(0, initialLines - currentLines);
161
- const statusLine = buildStatusLine(session, config, stats.issueTrajectory, stats.totalAccepted, stats.totalRejected, stats.totalDeferred, linesAdded, linesRemoved, elapsed) + (suffix ? ` | ${suffix}` : "");
177
+ const statusLine = buildStatusLine(session, config, stats.issueTrajectory, stats.totalAccepted, stats.totalRejected, stats.totalDeferred, linesAdded, linesRemoved, elapsed, phaseExtras) + (suffix ? ` | ${suffix}` : "");
162
178
  planContent = updatePlanStatusLine(planContent, statusLine);
163
179
  writeFileSync(planPath, planContent);
164
180
  session.planHash = hashFile(planPath);
@@ -234,16 +250,17 @@ function buildPriorDecisions(cwd, sessionId, currentRound) {
234
250
  /**
235
251
  * Invocation state machine — single owner of all retry/downgrade logic for
236
252
  * provider invocations. Providers are single-shot; this function decides
237
- * when to downgrade from structured output to legacy mode.
253
+ * when to downgrade from structured output (schema-enforced) to prompted
254
+ * output (tag-wrapped, prompt-enforced).
238
255
  *
239
- * Strict 2-attempt cap: structured (1) -> legacy fallback (1) -> terminal.
256
+ * Strict 2-attempt cap: structured (1) -> prompted fallback (1) -> terminal.
240
257
  *
241
258
  * Failure handling:
242
259
  * - Provider `capability` error in structured mode → downgrade
243
260
  * - Provider `fatal` error → terminal (no downgrade)
244
261
  * - JSON.parse failure on structured output → downgrade
245
262
  * - Zod validation failure on structured output → terminal (NOT retried)
246
- * - Any failure in legacy mode → terminal
263
+ * - Any failure in prompted mode → terminal
247
264
  *
248
265
  * Observability: when `metricsContext` is provided, each attempt emits a
249
266
  * start/end line to stderr, collects `InvocationAttempt` records, and
@@ -254,9 +271,9 @@ function buildPriorDecisions(cwd, sessionId, currentRound) {
254
271
  * filesystem round-trip.
255
272
  */
256
273
  async function invokeWithStateMachine(args) {
257
- const { provider, invokeOptions, jsonSchema, buildPrompt, parseStructured, parseLegacy, roundLabel, metricsContext, } = args;
274
+ const { provider, invokeOptions, jsonSchema, buildPrompt, parseStructured, parsePrompted, roundLabel, metricsContext, } = args;
258
275
  const supported = await provider.checkStructuredOutputSupport();
259
- let mode = supported ? "structured" : "legacy";
276
+ let mode = supported ? "structured" : "prompted";
260
277
  let attempt = 0;
261
278
  const maxAttempts = 2;
262
279
  let lastError = null;
@@ -343,10 +360,10 @@ async function invokeWithStateMachine(args) {
343
360
  response.error.kind === "capability" &&
344
361
  attempt < maxAttempts) {
345
362
  provider.markNonCapable();
346
- mode = "legacy";
363
+ mode = "prompted";
347
364
  continue;
348
365
  }
349
- // Fatal, or already in legacy mode — terminal
366
+ // Fatal, or already in prompted mode — terminal
350
367
  throw new Error(`${roundLabel} failed (exit ${response.error.exitCode}, ${response.error.kind}):\n${response.error.message}`);
351
368
  }
352
369
  // Provider returned output — record output size, try to parse.
@@ -357,7 +374,7 @@ async function invokeWithStateMachine(args) {
357
374
  try {
358
375
  const parsed = mode === "structured"
359
376
  ? parseStructured(response.output)
360
- : parseLegacy(response.output);
377
+ : parsePrompted(response.output);
361
378
  attemptRecord.ok = true;
362
379
  attempts.push(attemptRecord);
363
380
  logEnd(roundLabel, providerLabel, mode, promptChars, outputChars, response.duration ?? 0, true, null, metricsContext);
@@ -387,10 +404,10 @@ async function invokeWithStateMachine(args) {
387
404
  attempts.push(attemptRecord);
388
405
  logEnd(roundLabel, providerLabel, mode, promptChars, outputChars, response.duration ?? 0, false, `parse: ${truncate(lastError.message, 200)}`, metricsContext);
389
406
  provider.markNonCapable();
390
- mode = "legacy";
407
+ mode = "prompted";
391
408
  continue;
392
409
  }
393
- // Legacy parse failure — terminal
410
+ // Prompted parse failure — terminal
394
411
  attemptRecord.ok = false;
395
412
  attemptRecord.error_kind = "parse";
396
413
  attempts.push(attemptRecord);
@@ -449,6 +466,19 @@ export async function runReviewRound(session, cwd, config, reviewerProvider) {
449
466
  const planPath = resolve(cwd, session.planPath);
450
467
  const planContent = readFileSync(planPath, "utf-8");
451
468
  const phase = getReviewPhase(round);
469
+ const existingFeedback = readRoundFeedback(cwd, session.id, round);
470
+ if (existingFeedback) {
471
+ const severity = severityFromFeedback(existingFeedback);
472
+ const converged = isConverged(existingFeedback);
473
+ const phaseExtras = phaseExtrasFromFeedback(phase, existingFeedback);
474
+ return {
475
+ round,
476
+ feedback: existingFeedback,
477
+ severity,
478
+ converged,
479
+ phaseExtras,
480
+ };
481
+ }
452
482
  const priorDecisions = buildPriorDecisions(cwd, session.id, round);
453
483
  // Persist a snapshot of the plan as the reviewer is about to see it. On
454
484
  // round N+1 we'll diff against this snapshot to produce the incremental
@@ -491,7 +521,7 @@ export async function runReviewRound(session, cwd, config, reviewerProvider) {
491
521
  ? buildIncrementalReviewPrompt(planDiff ?? planContent, planContent, priorDecisions, phase, structuredOutput)
492
522
  : buildReviewPrompt(planContent, priorDecisions, phase, structuredOutput),
493
523
  parseStructured: (output) => parseStructuredFeedbackForPhase(output, phase, planContent),
494
- parseLegacy: (output) => parseFeedbackForPhase(output, phase, planContent),
524
+ parsePrompted: (output) => parseFeedbackForPhase(output, phase, planContent),
495
525
  roundLabel: `Round ${round} review`,
496
526
  metricsContext: {
497
527
  sessionId: session.id,
@@ -500,37 +530,68 @@ export async function runReviewRound(session, cwd, config, reviewerProvider) {
500
530
  role: "review",
501
531
  },
502
532
  });
503
- writeRoundFeedback(cwd, session.id, round, feedback);
504
- const severity = severityFromFeedback(feedback);
505
- const converged = isConverged(feedback);
533
+ const finalized = finalizeFeedback({
534
+ session,
535
+ cwd,
536
+ round,
537
+ feedback,
538
+ reviewerSessionInited,
539
+ capturedSessionId,
540
+ });
541
+ const severity = severityFromFeedback(finalized.feedback);
542
+ const converged = isConverged(finalized.feedback);
543
+ const phaseExtras = phaseExtrasFromFeedback(phase, finalized.feedback);
506
544
  const timing = metrics ? summarizeTiming(metrics) : undefined;
507
- // Persist the canonical reviewer session ID. For claude this is the
508
- // UUID we generated; for codex it's the thread_id captured from --json
509
- // output. Either way, future rounds resume this conversation.
545
+ return {
546
+ round,
547
+ feedback: finalized.feedback,
548
+ severity,
549
+ converged,
550
+ phaseExtras,
551
+ timing,
552
+ };
553
+ }
554
+ /**
555
+ * Persist review-round artifacts: feedback file, reviewer session ID
556
+ * promotion, blocked-status update, and session.json commit. Mirrors
557
+ * `finalizeRevision` so review and revision rounds share idempotency
558
+ * semantics.
559
+ *
560
+ * Write ordering:
561
+ * 1. `round-N-feedback.json` — the reviewer payload
562
+ * 2. `session.reviewerSessionId` / `reviewerSessionInitialized` (if first round)
563
+ * 3. `session.status = "blocked"` (when verdict === "blocked")
564
+ * 4. `session.json` — single write covering 2+3 (commit point)
565
+ *
566
+ * Idempotency: if `round-N-feedback.json` already exists, returns the
567
+ * existing feedback with `fresh: false`. Tool-level checks in
568
+ * `planpong_get_feedback` are the primary replay path; this helper is the
569
+ * operation-level safety net.
570
+ *
571
+ * **Round advancement is NOT performed here.** `currentRound` is owned by
572
+ * the callers driving the loop (MCP get-feedback, CLI loop). Moving it
573
+ * here would double-advance in MCP mode.
574
+ */
575
+ export function finalizeFeedback({ session, cwd, round, feedback, reviewerSessionInited, capturedSessionId, }) {
576
+ const existing = readRoundFeedback(cwd, session.id, round);
577
+ if (existing) {
578
+ return { feedback: existing, fresh: false };
579
+ }
580
+ writeRoundFeedback(cwd, session.id, round, feedback);
581
+ let sessionDirty = false;
510
582
  if (!reviewerSessionInited && capturedSessionId) {
511
583
  session.reviewerSessionId = capturedSessionId;
512
584
  session.reviewerSessionInitialized = true;
513
- writeSessionState(cwd, session);
585
+ sessionDirty = true;
514
586
  }
515
- // Extract phase-specific extras for status line
516
- const phaseExtras = {};
517
587
  if (feedback.verdict === "blocked") {
518
- phaseExtras.is_blocked = true;
519
588
  session.status = "blocked";
520
- writeSessionState(cwd, session);
521
- }
522
- if (phase === "direction" && "confidence" in feedback) {
523
- phaseExtras.confidence = feedback.confidence;
589
+ sessionDirty = true;
524
590
  }
525
- if (phase === "risk") {
526
- if ("risk_level" in feedback) {
527
- const riskFb = feedback;
528
- phaseExtras.risk_level = riskFb.risk_level;
529
- phaseExtras.risk_count = riskFb.risks?.length ?? 0;
530
- phaseExtras.risks_promoted = feedback.issues.length;
531
- }
591
+ if (sessionDirty) {
592
+ writeSessionState(cwd, session);
532
593
  }
533
- return { round, feedback, severity, converged, phaseExtras, timing };
594
+ return { feedback, fresh: true };
534
595
  }
535
596
  /**
536
597
  * Run a single revision round: send plan + feedback to the planner for revision.
@@ -539,6 +600,18 @@ export async function runRevisionRound(session, cwd, config, plannerProvider) {
539
600
  const round = session.currentRound;
540
601
  const planPath = resolve(cwd, session.planPath);
541
602
  const planContent = readFileSync(planPath, "utf-8");
603
+ const existingResponse = readRoundResponse(cwd, session.id, round);
604
+ if (existingResponse) {
605
+ const tally = tallyResponses(existingResponse.responses);
606
+ return {
607
+ round,
608
+ revision: existingResponse,
609
+ accepted: tally.accepted,
610
+ rejected: tally.rejected,
611
+ deferred: tally.deferred,
612
+ planUpdated: false,
613
+ };
614
+ }
542
615
  const feedback = readRoundFeedback(cwd, session.id, round);
543
616
  if (!feedback) {
544
617
  throw new Error(`No feedback found for session ${session.id} round ${round}`);
@@ -565,7 +638,7 @@ export async function runRevisionRound(session, cwd, config, plannerProvider) {
565
638
  jsonSchema,
566
639
  buildPrompt: (structuredOutput) => buildRevisionPrompt(planContent, feedback, keyDecisions, null, phase, structuredOutput, config.revision_mode),
567
640
  parseStructured: (output) => parseStructuredRevision(output, revisionShape),
568
- parseLegacy: (output) => parseRevision(output, revisionShape),
641
+ parsePrompted: (output) => parseRevision(output, revisionShape),
569
642
  roundLabel: `Round ${round} revision`,
570
643
  metricsContext: {
571
644
  sessionId: session.id,
@@ -832,7 +905,7 @@ async function runEditsRetry(args) {
832
905
  };
833
906
  const response = await plannerProvider.invoke(prompt, options);
834
907
  const attemptRecord = {
835
- mode: useStructured ? "structured" : "legacy",
908
+ mode: useStructured ? "structured" : "prompted",
836
909
  provider: plannerProvider.name,
837
910
  model: config.planner.model ?? null,
838
911
  effort: config.planner.effort ?? null,