gsd-pi 2.60.0-dev.2580e65 → 2.60.0-dev.d9052f5

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 (196) hide show
  1. package/dist/resources/extensions/ask-user-questions.js +4 -7
  2. package/dist/resources/extensions/gsd/auto/phases.js +7 -15
  3. package/dist/resources/extensions/gsd/auto-dashboard.js +8 -21
  4. package/dist/resources/extensions/gsd/auto-dispatch.js +3 -6
  5. package/dist/resources/extensions/gsd/auto-model-selection.js +9 -58
  6. package/dist/resources/extensions/gsd/auto-post-unit.js +2 -3
  7. package/dist/resources/extensions/gsd/auto-prompts.js +20 -36
  8. package/dist/resources/extensions/gsd/auto-recovery.js +18 -37
  9. package/dist/resources/extensions/gsd/auto-start.js +5 -9
  10. package/dist/resources/extensions/gsd/auto-timers.js +5 -11
  11. package/dist/resources/extensions/gsd/auto-unit-closeout.js +3 -5
  12. package/dist/resources/extensions/gsd/auto-verification.js +2 -3
  13. package/dist/resources/extensions/gsd/auto-worktree.js +55 -120
  14. package/dist/resources/extensions/gsd/auto.js +17 -39
  15. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -6
  16. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -2
  17. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +10 -4
  18. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +1 -2
  19. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +0 -7
  20. package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -11
  21. package/dist/resources/extensions/gsd/commands/catalog.js +0 -2
  22. package/dist/resources/extensions/gsd/commands-codebase.js +21 -48
  23. package/dist/resources/extensions/gsd/commands-inspect.js +1 -2
  24. package/dist/resources/extensions/gsd/commands-maintenance.js +19 -32
  25. package/dist/resources/extensions/gsd/complexity-classifier.js +4 -8
  26. package/dist/resources/extensions/gsd/custom-verification.js +2 -3
  27. package/dist/resources/extensions/gsd/gsd-db.js +13 -33
  28. package/dist/resources/extensions/gsd/guided-flow.js +9 -19
  29. package/dist/resources/extensions/gsd/init-wizard.js +0 -12
  30. package/dist/resources/extensions/gsd/markdown-renderer.js +9 -11
  31. package/dist/resources/extensions/gsd/md-importer.js +4 -5
  32. package/dist/resources/extensions/gsd/milestone-actions.js +2 -3
  33. package/dist/resources/extensions/gsd/milestone-ids.js +1 -2
  34. package/dist/resources/extensions/gsd/model-router.js +121 -156
  35. package/dist/resources/extensions/gsd/parallel-merge.js +3 -5
  36. package/dist/resources/extensions/gsd/parallel-orchestrator.js +14 -26
  37. package/dist/resources/extensions/gsd/preferences-types.js +0 -1
  38. package/dist/resources/extensions/gsd/preferences-validation.js +0 -45
  39. package/dist/resources/extensions/gsd/preferences.js +3 -15
  40. package/dist/resources/extensions/gsd/prompt-loader.js +2 -3
  41. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  42. package/dist/resources/extensions/gsd/rule-registry.js +6 -7
  43. package/dist/resources/extensions/gsd/safe-fs.js +8 -6
  44. package/dist/resources/extensions/gsd/tools/complete-milestone.js +2 -3
  45. package/dist/resources/extensions/gsd/tools/complete-slice.js +2 -3
  46. package/dist/resources/extensions/gsd/tools/complete-task.js +2 -3
  47. package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -3
  48. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -3
  49. package/dist/resources/extensions/gsd/tools/plan-task.js +1 -2
  50. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +4 -4
  51. package/dist/resources/extensions/gsd/tools/reopen-slice.js +1 -2
  52. package/dist/resources/extensions/gsd/tools/reopen-task.js +1 -2
  53. package/dist/resources/extensions/gsd/tools/replan-slice.js +1 -2
  54. package/dist/resources/extensions/gsd/tools/validate-milestone.js +1 -2
  55. package/dist/resources/extensions/gsd/triage-resolution.js +4 -11
  56. package/dist/resources/extensions/gsd/workflow-events.js +1 -2
  57. package/dist/resources/extensions/gsd/workflow-logger.js +4 -37
  58. package/dist/resources/extensions/gsd/workflow-migration.js +12 -14
  59. package/dist/resources/extensions/gsd/workflow-projections.js +2 -2
  60. package/dist/resources/extensions/gsd/workflow-reconcile.js +2 -2
  61. package/dist/resources/extensions/gsd/worktree-manager.js +14 -26
  62. package/dist/resources/extensions/shared/interview-ui.js +1 -3
  63. package/dist/web/standalone/.next/BUILD_ID +1 -1
  64. package/dist/web/standalone/.next/app-path-routes-manifest.json +19 -19
  65. package/dist/web/standalone/.next/build-manifest.json +2 -2
  66. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  67. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  68. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/index.html +1 -1
  84. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app-paths-manifest.json +19 -19
  91. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  92. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  93. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  94. package/package.json +1 -1
  95. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  96. package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -5
  97. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  98. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -2
  99. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  100. package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -16
  101. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  102. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +0 -26
  103. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  104. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  105. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  106. package/packages/pi-coding-agent/dist/core/lsp/config.js +1 -6
  107. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  108. package/packages/pi-coding-agent/dist/core/lsp/defaults.json +2 -2
  109. package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -6
  110. package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -19
  111. package/packages/pi-coding-agent/src/core/extensions/types.ts +0 -26
  112. package/packages/pi-coding-agent/src/core/lsp/config.ts +1 -7
  113. package/packages/pi-coding-agent/src/core/lsp/defaults.json +2 -2
  114. package/src/resources/extensions/ask-user-questions.ts +3 -7
  115. package/src/resources/extensions/gsd/auto/phases.ts +7 -17
  116. package/src/resources/extensions/gsd/auto-dashboard.ts +8 -22
  117. package/src/resources/extensions/gsd/auto-dispatch.ts +3 -7
  118. package/src/resources/extensions/gsd/auto-model-selection.ts +15 -77
  119. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -4
  120. package/src/resources/extensions/gsd/auto-prompts.ts +20 -37
  121. package/src/resources/extensions/gsd/auto-recovery.ts +18 -38
  122. package/src/resources/extensions/gsd/auto-start.ts +9 -10
  123. package/src/resources/extensions/gsd/auto-timers.ts +5 -12
  124. package/src/resources/extensions/gsd/auto-unit-closeout.ts +2 -6
  125. package/src/resources/extensions/gsd/auto-verification.ts +6 -3
  126. package/src/resources/extensions/gsd/auto-worktree.ts +55 -121
  127. package/src/resources/extensions/gsd/auto.ts +17 -40
  128. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -4
  129. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +2 -2
  130. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +16 -4
  131. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +1 -2
  132. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +0 -8
  133. package/src/resources/extensions/gsd/bootstrap/system-context.ts +10 -11
  134. package/src/resources/extensions/gsd/commands/catalog.ts +0 -2
  135. package/src/resources/extensions/gsd/commands-codebase.ts +20 -52
  136. package/src/resources/extensions/gsd/commands-inspect.ts +1 -2
  137. package/src/resources/extensions/gsd/commands-maintenance.ts +19 -28
  138. package/src/resources/extensions/gsd/complexity-classifier.ts +4 -9
  139. package/src/resources/extensions/gsd/custom-verification.ts +2 -3
  140. package/src/resources/extensions/gsd/gsd-db.ts +14 -12
  141. package/src/resources/extensions/gsd/guided-flow.ts +8 -9
  142. package/src/resources/extensions/gsd/init-wizard.ts +0 -12
  143. package/src/resources/extensions/gsd/markdown-renderer.ts +17 -11
  144. package/src/resources/extensions/gsd/md-importer.ts +4 -5
  145. package/src/resources/extensions/gsd/milestone-actions.ts +2 -3
  146. package/src/resources/extensions/gsd/milestone-ids.ts +1 -2
  147. package/src/resources/extensions/gsd/model-router.ts +173 -199
  148. package/src/resources/extensions/gsd/parallel-merge.ts +3 -5
  149. package/src/resources/extensions/gsd/parallel-orchestrator.ts +14 -18
  150. package/src/resources/extensions/gsd/preferences-types.ts +0 -13
  151. package/src/resources/extensions/gsd/preferences-validation.ts +0 -45
  152. package/src/resources/extensions/gsd/preferences.ts +3 -16
  153. package/src/resources/extensions/gsd/prompt-loader.ts +2 -3
  154. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  155. package/src/resources/extensions/gsd/rule-registry.ts +6 -7
  156. package/src/resources/extensions/gsd/safe-fs.ts +5 -6
  157. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +0 -63
  158. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +2 -27
  159. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +4 -4
  160. package/src/resources/extensions/gsd/tests/model-router.test.ts +3 -403
  161. package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -62
  162. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +0 -21
  163. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +6 -6
  164. package/src/resources/extensions/gsd/tools/complete-milestone.ts +6 -3
  165. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -3
  166. package/src/resources/extensions/gsd/tools/complete-task.ts +6 -3
  167. package/src/resources/extensions/gsd/tools/plan-milestone.ts +6 -3
  168. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -3
  169. package/src/resources/extensions/gsd/tools/plan-task.ts +3 -2
  170. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +6 -4
  171. package/src/resources/extensions/gsd/tools/reopen-slice.ts +3 -2
  172. package/src/resources/extensions/gsd/tools/reopen-task.ts +3 -2
  173. package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -2
  174. package/src/resources/extensions/gsd/tools/validate-milestone.ts +3 -2
  175. package/src/resources/extensions/gsd/triage-resolution.ts +4 -11
  176. package/src/resources/extensions/gsd/types.ts +0 -1
  177. package/src/resources/extensions/gsd/workflow-events.ts +1 -2
  178. package/src/resources/extensions/gsd/workflow-logger.ts +5 -52
  179. package/src/resources/extensions/gsd/workflow-migration.ts +12 -14
  180. package/src/resources/extensions/gsd/workflow-projections.ts +2 -2
  181. package/src/resources/extensions/gsd/workflow-reconcile.ts +2 -2
  182. package/src/resources/extensions/gsd/worktree-manager.ts +14 -16
  183. package/src/resources/extensions/shared/interview-ui.ts +1 -3
  184. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts +0 -2
  185. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts.map +0 -1
  186. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +0 -47
  187. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +0 -1
  188. package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +0 -70
  189. package/src/resources/extensions/gsd/tests/capability-router.test.ts +0 -347
  190. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +0 -1188
  191. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +0 -841
  192. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +0 -284
  193. package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +0 -120
  194. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +0 -144
  195. /package/dist/web/standalone/.next/static/{ogyMN7M-3bGGuRY08L5HR → JVkoVYumy0cDhOQISEYdG}/_buildManifest.js +0 -0
  196. /package/dist/web/standalone/.next/static/{ogyMN7M-3bGGuRY08L5HR → JVkoVYumy0cDhOQISEYdG}/_ssgManifest.js +0 -0
@@ -721,8 +721,6 @@ export async function runGuards(
721
721
  // ── Stop/Backtrack directive guard (#3487) ──
722
722
  // Check for unexecuted stop or backtrack captures BEFORE dispatching any unit.
723
723
  // This ensures user "halt" directives are honored immediately.
724
- // IMPORTANT: Fail-closed — any exception during stop handling still breaks the loop
725
- // to ensure user halt intent is never silently dropped.
726
724
  try {
727
725
  const { loadStopCaptures, markCaptureExecuted } = await import("../captures.js");
728
726
  const stopCaptures = loadStopCaptures(s.basePath);
@@ -739,10 +737,12 @@ export async function runGuards(
739
737
  basename(s.originalBasePath || s.basePath),
740
738
  );
741
739
 
742
- // Pause first ensures auto-mode stops even if later steps fail
743
- await deps.pauseAuto(ctx, pi);
740
+ // Mark all stop/backtrack captures as executed so they don't re-fire
741
+ for (const cap of stopCaptures) {
742
+ markCaptureExecuted(s.basePath, cap.id);
743
+ }
744
744
 
745
- // For backtrack captures, write the backtrack trigger after pausing
745
+ // For backtrack captures, write the backtrack trigger before pausing
746
746
  if (isBacktrack) {
747
747
  try {
748
748
  const { executeBacktrack } = await import("../triage-resolution.js");
@@ -752,19 +752,12 @@ export async function runGuards(
752
752
  }
753
753
  }
754
754
 
755
- // Mark captures as executed only after successful pause/transition
756
- for (const cap of stopCaptures) {
757
- markCaptureExecuted(s.basePath, cap.id);
758
- }
759
-
755
+ await deps.pauseAuto(ctx, pi);
760
756
  debugLog("autoLoop", { phase: "exit", reason: isBacktrack ? "user-backtrack" : "user-stop" });
761
757
  return { action: "break", reason: isBacktrack ? "user-backtrack" : "user-stop" };
762
758
  }
763
759
  } catch (e) {
764
- // Fail-closed: if anything in the stop guard throws, break the loop
765
- // rather than silently continuing and dropping user halt intent
766
760
  debugLog("guards", { phase: "stop-guard-error", error: String(e) });
767
- return { action: "break", reason: "stop-guard-error" };
768
761
  }
769
762
 
770
763
  // Budget ceiling guard
@@ -1268,9 +1261,7 @@ export async function runUnitPhase(
1268
1261
  blockers: [],
1269
1262
  nextSteps: [],
1270
1263
  });
1271
- } catch (err) { /* non-fatal — anchor is advisory */
1272
- logWarning("engine", `phase anchor failed: ${err instanceof Error ? err.message : String(err)}`);
1273
- }
1264
+ } catch { /* non-fatal — anchor is advisory */ }
1274
1265
  }
1275
1266
 
1276
1267
  deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitResult.status, artifactVerified, ...(unitResult.errorContext ? { errorContext: unitResult.errorContext } : {}) }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
@@ -1393,4 +1384,3 @@ export async function runFinalize(
1393
1384
 
1394
1385
  return { action: "next", data: undefined as void };
1395
1386
  }
1396
-
@@ -31,7 +31,6 @@ import {
31
31
  getRtkSessionSavings,
32
32
  type RtkSessionSavings,
33
33
  } from "../shared/rtk-session-stats.js";
34
- import { logWarning } from "./workflow-logger.js";
35
34
 
36
35
  // ─── UAT Slice Extraction ─────────────────────────────────────────────────────
37
36
 
@@ -286,9 +285,8 @@ export function updateSliceProgressCache(base: string, mid: string, activeSid?:
286
285
  taskDetails = dbTasks.map(t => ({ id: t.id, title: t.title, done: t.status === "complete" || t.status === "done" }));
287
286
  }
288
287
  }
289
- } catch (err) {
288
+ } catch {
290
289
  // Non-fatal — just omit task count
291
- logWarning("dashboard", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
292
290
  }
293
291
  }
294
292
 
@@ -299,9 +297,8 @@ export function updateSliceProgressCache(base: string, mid: string, activeSid?:
299
297
  activeSliceTasks,
300
298
  taskDetails,
301
299
  };
302
- } catch (err) {
300
+ } catch {
303
301
  // Non-fatal — widget just won't show progress bar
304
- logWarning("dashboard", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
305
302
  }
306
303
  }
307
304
 
@@ -335,9 +332,8 @@ function refreshLastCommit(basePath: string): void {
335
332
  };
336
333
  }
337
334
  lastCommitFetchedAt = Date.now();
338
- } catch (err) {
335
+ } catch {
339
336
  // Non-fatal — just skip last commit display
340
- logWarning("dashboard", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
341
337
  }
342
338
  }
343
339
 
@@ -380,9 +376,7 @@ function ensureWidgetModeLoaded(): void {
380
376
  if (saved && WIDGET_MODES.includes(saved as WidgetMode)) {
381
377
  widgetMode = saved as WidgetMode;
382
378
  }
383
- } catch (err) { /* non-fatal — use default */
384
- logWarning("dashboard", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
385
- }
379
+ } catch { /* non-fatal — use default */ }
386
380
  }
387
381
 
388
382
  /** Persist widget mode to global preferences YAML. */
@@ -401,9 +395,7 @@ function persistWidgetMode(mode: WidgetMode): void {
401
395
  content = content.trimEnd() + "\n" + line + "\n";
402
396
  }
403
397
  writeFileSync(prefsPath, content, "utf-8");
404
- } catch (err) { /* non-fatal — mode still set in memory */
405
- logWarning("dashboard", `file write failed: ${err instanceof Error ? err.message : String(err)}`);
406
- }
398
+ } catch { /* non-fatal — mode still set in memory */ }
407
399
  }
408
400
 
409
401
  /** Cycle to the next widget mode. Returns the new mode. */
@@ -466,9 +458,7 @@ export function updateProgressWidget(
466
458
 
467
459
  // Cache git branch at widget creation time (not per render)
468
460
  let cachedBranch: string | null = null;
469
- try { cachedBranch = getCurrentBranch(accessors.getBasePath()); } catch (err) { /* not in git repo */
470
- logWarning("dashboard", `git branch detection failed: ${err instanceof Error ? err.message : String(err)}`);
471
- }
461
+ try { cachedBranch = getCurrentBranch(accessors.getBasePath()); } catch { /* not in git repo */ }
472
462
 
473
463
  // Cache short pwd (last 2 path segments only) + worktree/branch info
474
464
  let widgetPwd: string;
@@ -505,8 +495,7 @@ export function updateProgressWidget(
505
495
  const sessionId = ctx.sessionManager.getSessionId();
506
496
  const savings = sessionId ? getRtkSessionSavings(accessors.getBasePath(), sessionId) : null;
507
497
  cachedRtkLabel = formatRtkSavingsLabel(savings);
508
- } catch (err) {
509
- logWarning("dashboard", `RTK savings lookup failed: ${err instanceof Error ? (err as Error).message : String(err)}`);
498
+ } catch {
510
499
  cachedRtkLabel = null;
511
500
  }
512
501
  };
@@ -530,9 +519,7 @@ export function updateProgressWidget(
530
519
  }
531
520
  refreshRtkLabel();
532
521
  cachedLines = undefined;
533
- } catch (err) { /* non-fatal */
534
- logWarning("dashboard", `DB status update failed: ${err instanceof Error ? err.message : String(err)}`);
535
- }
522
+ } catch { /* non-fatal */ }
536
523
  }, 15_000);
537
524
 
538
525
  return {
@@ -891,4 +878,3 @@ function padToWidth(s: string, colWidth: number): string {
891
878
  if (vis >= colWidth) return truncateToWidth(s, colWidth, "…");
892
879
  return s + " ".repeat(colWidth - vis);
893
880
  }
894
-
@@ -28,7 +28,7 @@ import {
28
28
  buildSliceFileName,
29
29
  } from "./paths.js";
30
30
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
31
- import { logWarning, logError } from "./workflow-logger.js";
31
+ import { logError } from "./workflow-logger.js";
32
32
  import { join } from "node:path";
33
33
  import { hasImplementationArtifacts } from "./auto-recovery.js";
34
34
  import {
@@ -712,9 +712,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
712
712
  }
713
713
  }
714
714
  }
715
- } catch (err) { /* fall through — don't block on DB errors */
716
- logWarning("dispatch", `verification class check failed: ${err instanceof Error ? err.message : String(err)}`);
717
- }
715
+ } catch { /* fall through — don't block on DB errors */ }
718
716
 
719
717
  return {
720
718
  action: "dispatch",
@@ -756,9 +754,8 @@ export async function resolveDispatch(
756
754
  try {
757
755
  const registry = getRegistry();
758
756
  return await registry.evaluateDispatch(ctx);
759
- } catch (err) {
757
+ } catch {
760
758
  // Registry not initialized — fall back to inline loop
761
- logWarning("dispatch", `registry dispatch failed, falling back to inline rules: ${err instanceof Error ? err.message : String(err)}`);
762
759
  }
763
760
 
764
761
  for (const rule of DISPATCH_RULES) {
@@ -782,4 +779,3 @@ export async function resolveDispatch(
782
779
  export function getDispatchRuleNames(): string[] {
783
780
  return DISPATCH_RULES.map((r) => r.name);
784
781
  }
785
-
@@ -9,8 +9,8 @@ import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
9
9
  import type { GSDPreferences } from "./preferences.js";
10
10
  import { resolveModelWithFallbacksForUnit, resolveDynamicRoutingConfig } from "./preferences.js";
11
11
  import type { ComplexityTier } from "./complexity-classifier.js";
12
- import { classifyUnitComplexity, tierLabel } from "./complexity-classifier.js";
13
- import { resolveModelForComplexity, escalateTier, getEligibleModels, loadCapabilityOverrides } from "./model-router.js";
12
+ import { classifyUnitComplexity, tierLabel, extractTaskMetadata } from "./complexity-classifier.js";
13
+ import { resolveModelForComplexity, escalateTier } from "./model-router.js";
14
14
  import { getLedger, getProjectTotals } from "./metrics.js";
15
15
  import { unitPhaseLabel } from "./auto-dashboard.js";
16
16
 
@@ -107,65 +107,15 @@ export async function selectAndApplyModel(
107
107
  }
108
108
  }
109
109
 
110
- // Load user capability overrides from preferences (D-17: deep-merged with built-in profiles)
111
- const capabilityOverrides = loadCapabilityOverrides(
112
- (prefs as { modelOverrides?: Record<string, { capabilities?: Record<string, number> }> } | undefined) ?? {},
113
- );
114
-
115
- // Fire before_model_select hook (ADR-004, D-03)
116
- // Hook can override model selection entirely by returning { modelId }
117
- let hookOverride: string | undefined;
118
- if (routingConfig.hooks !== false) {
119
- const eligible = getEligibleModels(
120
- classification.tier,
121
- availableModelIds,
122
- routingConfig,
123
- );
124
- const hookResult = await pi.emitBeforeModelSelect({
125
- unitType,
126
- unitId,
127
- classification: {
128
- tier: classification.tier,
129
- reason: classification.reason,
130
- downgraded: classification.downgraded,
131
- },
132
- taskMetadata: classification.taskMetadata as Record<string, unknown> | undefined,
133
- eligibleModels: eligible,
134
- phaseConfig: modelConfig ? {
135
- primary: modelConfig.primary,
136
- fallbacks: modelConfig.fallbacks ?? [],
137
- } : undefined,
138
- });
139
- if (hookResult?.modelId) {
140
- hookOverride = hookResult.modelId;
141
- }
142
- }
110
+ // Extract task metadata for capability scoring
111
+ const taskMeta = unitType === "execute-task"
112
+ ? extractTaskMetadata(unitId, basePath)
113
+ : undefined;
143
114
 
144
- let routingResult: ReturnType<typeof resolveModelForComplexity>;
145
- if (hookOverride) {
146
- // Hook override bypasses capability scoring entirely
147
- routingResult = {
148
- modelId: hookOverride,
149
- fallbacks: [
150
- ...(modelConfig?.fallbacks ?? []).filter(f => f !== hookOverride),
151
- ...(modelConfig?.primary && modelConfig.primary !== hookOverride ? [modelConfig.primary] : []),
152
- ],
153
- tier: classification.tier,
154
- wasDowngraded: hookOverride !== modelConfig?.primary,
155
- reason: `hook override: ${hookOverride}`,
156
- selectionMethod: "tier-only",
157
- };
158
- } else {
159
- routingResult = resolveModelForComplexity(
160
- classification,
161
- modelConfig,
162
- routingConfig,
163
- availableModelIds,
164
- unitType,
165
- classification.taskMetadata,
166
- capabilityOverrides,
167
- );
168
- }
115
+ const routingResult = resolveModelForComplexity(
116
+ classification, modelConfig, routingConfig, availableModelIds,
117
+ unitType, taskMeta,
118
+ );
169
119
 
170
120
  if (routingResult.wasDowngraded) {
171
121
  effectiveModelConfig = {
@@ -173,23 +123,11 @@ export async function selectAndApplyModel(
173
123
  fallbacks: routingResult.fallbacks,
174
124
  };
175
125
  if (verbose) {
176
- if (routingResult.selectionMethod === "capability-scored" && routingResult.capabilityScores) {
177
- // Verbose scoring breakdown for capability-scored decisions (D-20)
178
- const tierLbl = tierLabel(classification.tier);
179
- const scores = Object.entries(routingResult.capabilityScores)
180
- .sort(([, a], [, b]) => b - a)
181
- .map(([id, score]) => `${id}: ${score.toFixed(1)}`)
182
- .join(", ");
183
- ctx.ui.notify(
184
- `Dynamic routing [${tierLbl}]: ${routingResult.modelId} (capability-scored) — ${scores}`,
185
- "info",
186
- );
187
- } else {
188
- ctx.ui.notify(
189
- `Dynamic routing [${tierLabel(classification.tier)}]: ${routingResult.modelId} (${classification.reason})`,
190
- "info",
191
- );
192
- }
126
+ const method = routingResult.selectionMethod === "capability-scored" ? "capability-scored" : "tier-only";
127
+ ctx.ui.notify(
128
+ `Dynamic routing [${tierLabel(classification.tier)}]: ${routingResult.modelId} (${method} — ${classification.reason})`,
129
+ "info",
130
+ );
193
131
  }
194
132
  }
195
133
  routingTierLabel = ` [${tierLabel(classification.tier)}]`;
@@ -279,9 +279,8 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
279
279
  try {
280
280
  const { getTaskIssueNumberForCommit } = await import("../github-sync/sync.js");
281
281
  ghIssueNumber = getTaskIssueNumberForCommit(s.basePath, mid, sid, tid) ?? undefined;
282
- } catch (err) {
282
+ } catch {
283
283
  // GitHub sync not available — skip
284
- logWarning("engine", `GitHub issue lookup failed: ${err instanceof Error ? err.message : String(err)}`);
285
284
  }
286
285
 
287
286
  taskContext = {
@@ -559,7 +558,9 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
559
558
  } catch (dbErr) {
560
559
  // DB unavailable — fail explicitly rather than silently reverting to markdown mutation.
561
560
  // Use 'gsd recover' to rebuild DB state from disk if needed.
562
- logError("engine", `retry state-reset failed (DB unavailable): ${(dbErr as Error).message}. Run 'gsd recover' to reconcile.`);
561
+ process.stderr.write(
562
+ `gsd: retry state-reset failed (DB unavailable): ${(dbErr as Error).message}. Run 'gsd recover' to reconcile.\n`,
563
+ );
563
564
  }
564
565
  }
565
566
 
@@ -731,4 +732,3 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
731
732
 
732
733
  return "continue";
733
734
  }
734
-
@@ -27,7 +27,6 @@ import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary
27
27
  import { getPendingGates } from "./gsd-db.js";
28
28
  import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
29
29
  import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
30
- import { logWarning } from "./workflow-logger.js";
31
30
 
32
31
  // ─── Preamble Cap ─────────────────────────────────────────────────────────────
33
32
 
@@ -50,8 +49,7 @@ function formatExecutorConstraints(): string {
50
49
  try {
51
50
  const prefs = loadEffectiveGSDPreferences();
52
51
  windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences);
53
- } catch (e) {
54
- logWarning("prompt", `resolveExecutorContextWindow failed: ${(e as Error).message}`);
52
+ } catch {
55
53
  windowTokens = 200_000; // safe default
56
54
  }
57
55
  const budgets = computeBudgets(windowTokens);
@@ -200,9 +198,7 @@ export async function inlineDependencySummaries(
200
198
  }
201
199
  // If slice not found in DB, fall through to file-based parsing
202
200
  }
203
- } catch (err) {
204
- logWarning("prompt", `inlineDependencySummaries DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
205
- }
201
+ } catch { /* fall through */ }
206
202
 
207
203
  // If DB didn't provide depends, fall back to roadmap parsing
208
204
  if (!depends) {
@@ -280,8 +276,8 @@ export async function inlineDecisionsFromDb(
280
276
  return `### Decisions\nSource: \`.gsd/DECISIONS.md\`\n\n${formatted}`;
281
277
  }
282
278
  }
283
- } catch (err) {
284
- logWarning("prompt", `inlineDecisionsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
279
+ } catch {
280
+ // DB not available fall through to filesystem
285
281
  }
286
282
  return inlineGsdRootFile(base, "decisions.md", "Decisions");
287
283
  }
@@ -307,8 +303,8 @@ export async function inlineRequirementsFromDb(
307
303
  return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
308
304
  }
309
305
  }
310
- } catch (err) {
311
- logWarning("prompt", `inlineRequirementsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
306
+ } catch {
307
+ // DB not available fall through to filesystem
312
308
  }
313
309
  return inlineGsdRootFile(base, "requirements.md", "Requirements");
314
310
  }
@@ -329,8 +325,8 @@ export async function inlineProjectFromDb(
329
325
  return `### Project\nSource: \`.gsd/PROJECT.md\`\n\n${content}`;
330
326
  }
331
327
  }
332
- } catch (err) {
333
- logWarning("prompt", `inlineProjectFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
328
+ } catch {
329
+ // DB not available fall through to filesystem
334
330
  }
335
331
  return inlineGsdRootFile(base, "project.md", "Project");
336
332
  }
@@ -490,8 +486,8 @@ export function buildSkillActivationBlock(params: {
490
486
  for (const skillName of taskPlan.frontmatter.skills_used) {
491
487
  matched.add(normalizeSkillReference(skillName));
492
488
  }
493
- } catch (err) {
494
- logWarning("prompt", `parseTaskPlanFile failed: ${err instanceof Error ? err.message : String(err)}`);
489
+ } catch {
490
+ // Non-fatal malformed task plan should not break prompt construction
495
491
  }
496
492
  }
497
493
 
@@ -740,9 +736,7 @@ export async function checkNeedsReassessment(
740
736
  return { sliceId: lastCompleted };
741
737
  }
742
738
  }
743
- } catch (err) {
744
- logWarning("prompt", `checkNeedsReassessment DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
745
- }
739
+ } catch { /* fall through */ }
746
740
 
747
741
  // File-based fallback using roadmap checkboxes
748
742
  const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
@@ -808,9 +802,7 @@ export async function checkNeedsRunUat(
808
802
  return { sliceId: sid, uatType };
809
803
  }
810
804
  }
811
- } catch (err) {
812
- logWarning("prompt", `checkNeedsRunUat DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
813
- }
805
+ } catch { /* fall through */ }
814
806
 
815
807
  // File-based fallback using roadmap checkboxes
816
808
  if (!prefs?.uat_dispatch) return null;
@@ -1320,9 +1312,7 @@ export async function buildCompleteMilestonePrompt(
1320
1312
  if (isDbAvailable()) {
1321
1313
  sliceIds = getMilestoneSlices(mid).map(s => s.id);
1322
1314
  }
1323
- } catch (err) {
1324
- logWarning("prompt", `buildCompleteMilestonePrompt DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
1325
- }
1315
+ } catch { /* fall through */ }
1326
1316
  // File-based fallback: parse roadmap for slice IDs when DB has no data
1327
1317
  if (sliceIds.length === 0 && roadmapPath) {
1328
1318
  const roadmapContent = await loadFile(roadmapPath);
@@ -1403,9 +1393,7 @@ export async function buildValidateMilestonePrompt(
1403
1393
  }
1404
1394
  }
1405
1395
  }
1406
- } catch (err) {
1407
- logWarning("prompt", `buildValidateMilestonePrompt verification classes lookup failed: ${err instanceof Error ? err.message : String(err)}`);
1408
- }
1396
+ } catch { /* fall through */ }
1409
1397
 
1410
1398
  // Inline all slice summaries and UAT results
1411
1399
  let valSliceIds: string[] = [];
@@ -1414,9 +1402,7 @@ export async function buildValidateMilestonePrompt(
1414
1402
  if (isDbAvailable()) {
1415
1403
  valSliceIds = getMilestoneSlices(mid).map(s => s.id);
1416
1404
  }
1417
- } catch (err) {
1418
- logWarning("prompt", `buildValidateMilestonePrompt slice IDs lookup failed: ${err instanceof Error ? err.message : String(err)}`);
1419
- }
1405
+ } catch { /* fall through */ }
1420
1406
  // File-based fallback: parse roadmap for slice IDs when DB has no data
1421
1407
  if (valSliceIds.length === 0 && roadmapPath) {
1422
1408
  const roadmapContent = await loadFile(roadmapPath);
@@ -1555,8 +1541,8 @@ export async function buildReplanSlicePrompt(
1555
1541
  `- **${c.id}**: "${c.text}" — ${c.rationale ?? "no rationale"}`
1556
1542
  ).join("\n");
1557
1543
  }
1558
- } catch (err) {
1559
- logWarning("prompt", `loadReplanCaptures failed: ${err instanceof Error ? err.message : String(err)}`);
1544
+ } catch {
1545
+ // Non-fatal captures module may not be available
1560
1546
  }
1561
1547
 
1562
1548
  return loadPrompt("replan-slice", {
@@ -1656,8 +1642,8 @@ export async function buildReassessRoadmapPrompt(
1656
1642
  `- **${c.id}**: "${c.text}" — ${c.rationale ?? "deferred during triage"}`
1657
1643
  ).join("\n");
1658
1644
  }
1659
- } catch (err) {
1660
- logWarning("prompt", `loadDeferredCaptures failed: ${err instanceof Error ? err.message : String(err)}`);
1645
+ } catch {
1646
+ // Non-fatal captures module may not be available
1661
1647
  }
1662
1648
 
1663
1649
  const reassessCommitInstruction = "Do not commit — .gsd/ planning docs are managed externally and not tracked in git.";
@@ -1873,9 +1859,7 @@ export async function buildRewriteDocsPrompt(
1873
1859
  .filter(t => t.status !== "complete" && t.status !== "done")
1874
1860
  .map(t => ({ id: t.id }));
1875
1861
  }
1876
- } catch (err) {
1877
- logWarning("prompt", `buildRewriteDocsPrompt DB task lookup failed: ${err instanceof Error ? err.message : String(err)}`);
1878
- }
1862
+ } catch { /* fall through */ }
1879
1863
 
1880
1864
  if (!incompleteTasks) {
1881
1865
  // DB unavailable — no task data to inline
@@ -1927,4 +1911,3 @@ export async function buildRewriteDocsPrompt(
1927
1911
  overridesPath: relGsdRootFile("OVERRIDES"),
1928
1912
  });
1929
1913
  }
1930
-
@@ -15,7 +15,6 @@ import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from
15
15
  import { isDbAvailable, getTask, getSlice, getSliceTasks, updateTaskStatus } from "./gsd-db.js";
16
16
  import { isValidationTerminal } from "./state.js";
17
17
  import { getErrorMessage } from "./error-utils.js";
18
- import { logWarning, logError } from "./workflow-logger.js";
19
18
  import {
20
19
  nativeConflictFiles,
21
20
  nativeCommit,
@@ -73,8 +72,7 @@ export function hasImplementationArtifacts(basePath: string): boolean {
73
72
  stdio: ["ignore", "pipe", "pipe"],
74
73
  encoding: "utf-8",
75
74
  });
76
- } catch (e) {
77
- logWarning("recovery", `git rev-parse check failed: ${(e as Error).message}`);
75
+ } catch {
78
76
  return true;
79
77
  }
80
78
 
@@ -94,9 +92,8 @@ export function hasImplementationArtifacts(basePath: string): boolean {
94
92
  // implementation code (#1703).
95
93
  const implFiles = changedFiles.filter(f => !f.startsWith(".gsd/") && !f.startsWith(".gsd\\"));
96
94
  return implFiles.length > 0;
97
- } catch (e) {
95
+ } catch {
98
96
  // Non-fatal — if git operations fail, don't block the pipeline
99
- logWarning("recovery", `implementation artifact check failed: ${(e as Error).message}`);
100
97
  return true;
101
98
  }
102
99
  }
@@ -112,9 +109,8 @@ function detectMainBranch(basePath: string): string {
112
109
  encoding: "utf-8",
113
110
  });
114
111
  if (result.trim()) return "main";
115
- } catch (_) {
116
- // Expected — main doesn't exist, try master next
117
- void _;
112
+ } catch {
113
+ // main doesn't exist
118
114
  }
119
115
  try {
120
116
  const result = execFileSync("git", ["rev-parse", "--verify", "master"], {
@@ -123,13 +119,10 @@ function detectMainBranch(basePath: string): string {
123
119
  encoding: "utf-8",
124
120
  });
125
121
  if (result.trim()) return "master";
126
- } catch (_) {
127
- // Expected — master doesn't exist either
128
- void _;
122
+ } catch {
123
+ // master doesn't exist either
129
124
  }
130
- // Neither main nor master found — warn and fall back
131
- logWarning("recovery", "neither main nor master branch found, defaulting to main");
132
- return "main";
125
+ return "main"; // default fallback
133
126
  }
134
127
 
135
128
  /**
@@ -151,9 +144,8 @@ function getChangedFilesSinceBranch(basePath: string, targetBranch: string): str
151
144
  ).trim();
152
145
  return result ? result.split("\n").filter(Boolean) : [];
153
146
  }
154
- } catch (err) {
147
+ } catch {
155
148
  // merge-base failed — fall back
156
- logWarning("recovery", `merge-base detection failed: ${err instanceof Error ? err.message : String(err)}`);
157
149
  }
158
150
 
159
151
  // Fallback: check last 20 commits
@@ -163,8 +155,7 @@ function getChangedFilesSinceBranch(basePath: string, targetBranch: string): str
163
155
  { cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
164
156
  ).trim();
165
157
  return result ? [...new Set(result.split("\n").filter(Boolean))] : [];
166
- } catch (e) {
167
- logWarning("recovery", `git log fallback failed: ${(e as Error).message}`);
158
+ } catch {
168
159
  return [];
169
160
  }
170
161
  }
@@ -255,9 +246,8 @@ export function verifyExpectedArtifact(
255
246
  for (const gid of gateIds) {
256
247
  if (pendingIds.has(gid)) return false;
257
248
  }
258
- } catch (err) {
249
+ } catch {
259
250
  // DB unavailable — treat as verified to avoid blocking
260
- logWarning("recovery", `gate-evaluate DB check failed: ${err instanceof Error ? err.message : String(err)}`);
261
251
  }
262
252
  return true;
263
253
  }
@@ -345,9 +335,8 @@ export function verifyExpectedArtifact(
345
335
  }
346
336
  }
347
337
  }
348
- } catch (err) {
338
+ } catch {
349
339
  // Parse failure — don't block; slice plan may have non-standard format
350
- logWarning("recovery", `plan-slice task plan verification failed: ${err instanceof Error ? err.message : String(err)}`);
351
340
  }
352
341
  }
353
342
  }
@@ -377,8 +366,7 @@ export function verifyExpectedArtifact(
377
366
  const roadmap = parseLegacyRoadmap(roadmapContent);
378
367
  const slice = roadmap.slices.find((s) => s.id === sid);
379
368
  if (slice && !slice.done) return false;
380
- } catch (e) {
381
- logWarning("recovery", `roadmap parse failed: ${(e as Error).message}`);
369
+ } catch {
382
370
  return false;
383
371
  }
384
372
  }
@@ -430,9 +418,7 @@ export function writeBlockerPlaceholder(
430
418
  if (unitType === "execute-task" && isDbAvailable()) {
431
419
  const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
432
420
  if (mid && sid && tid) {
433
- try { updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString()); } catch (err) { /* non-fatal */
434
- logError("recovery", `DB status update failed: ${err instanceof Error ? err.message : String(err)}`);
435
- }
421
+ try { updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString()); } catch { /* non-fatal */ }
436
422
  }
437
423
  }
438
424
 
@@ -453,23 +439,20 @@ function abortAndResetMerge(
453
439
  if (hasMergeHead) {
454
440
  try {
455
441
  nativeMergeAbort(basePath);
456
- } catch (err) {
442
+ } catch {
457
443
  /* best-effort */
458
- logWarning("recovery", `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`);
459
444
  }
460
445
  } else if (squashMsgPath) {
461
446
  try {
462
447
  unlinkSync(squashMsgPath);
463
- } catch (err) {
448
+ } catch {
464
449
  /* best-effort */
465
- logWarning("recovery", `file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
466
450
  }
467
451
  }
468
452
  try {
469
453
  nativeResetHard(basePath);
470
- } catch (err) {
454
+ } catch {
471
455
  /* best-effort */
472
- logError("recovery", `git reset failed: ${err instanceof Error ? err.message : String(err)}`);
473
456
  }
474
457
  }
475
458
 
@@ -517,8 +500,7 @@ export function reconcileMergeState(
517
500
  try {
518
501
  nativeCheckoutTheirs(basePath, gsdConflicts);
519
502
  nativeAddPaths(basePath, gsdConflicts);
520
- } catch (e) {
521
- logError("recovery", `auto-resolve .gsd/ conflicts failed: ${(e as Error).message}`);
503
+ } catch {
522
504
  resolved = false;
523
505
  }
524
506
  if (resolved) {
@@ -531,8 +513,7 @@ export function reconcileMergeState(
531
513
  `Auto-resolved ${gsdConflicts.length} .gsd/ state file conflict(s) from prior merge.`,
532
514
  "info",
533
515
  );
534
- } catch (e) {
535
- logError("recovery", `auto-commit .gsd/ conflict resolution failed: ${(e as Error).message}`);
516
+ } catch {
536
517
  resolved = false;
537
518
  }
538
519
  }
@@ -611,4 +592,3 @@ export function buildLoopRemediationSteps(
611
592
  }
612
593
  return null;
613
594
  }
614
-