@taskless-app/swarm 0.6.35 → 0.6.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -3274,7 +3274,7 @@ var init_package = __esm({
3274
3274
  "package.json"() {
3275
3275
  package_default = {
3276
3276
  name: "@taskless-app/swarm",
3277
- version: "0.6.35",
3277
+ version: "0.6.36",
3278
3278
  type: "module",
3279
3279
  description: "Local control plane for a fleet of AI coding agents (drones), coordinating through Taskless. The overmind runs the swarm.",
3280
3280
  keywords: [
@@ -3325,7 +3325,7 @@ var init_package = __esm({
3325
3325
  execa: "^10.0.0",
3326
3326
  zod: "3.25.76"
3327
3327
  },
3328
- gitHead: "d17bb241cf5d92790e5050c85648b97657c6b795"
3328
+ gitHead: "2d673b2bafb12ef0ced20b2469d798f7ae712b3a"
3329
3329
  };
3330
3330
  }
3331
3331
  });
package/dist/overmind.js CHANGED
@@ -11863,7 +11863,7 @@ function parkReasonUnretriable(reason) {
11863
11863
  // package.json
11864
11864
  var package_default = {
11865
11865
  name: "@taskless-app/swarm",
11866
- version: "0.6.35",
11866
+ version: "0.6.36",
11867
11867
  type: "module",
11868
11868
  description: "Local control plane for a fleet of AI coding agents (drones), coordinating through Taskless. The overmind runs the swarm.",
11869
11869
  keywords: [
@@ -11914,7 +11914,7 @@ var package_default = {
11914
11914
  execa: "^10.0.0",
11915
11915
  zod: "3.25.76"
11916
11916
  },
11917
- gitHead: "d17bb241cf5d92790e5050c85648b97657c6b795"
11917
+ gitHead: "2d673b2bafb12ef0ced20b2469d798f7ae712b3a"
11918
11918
  };
11919
11919
 
11920
11920
  // src/version.ts
@@ -14228,8 +14228,8 @@ function buildAnomalyCandidates(db, now, thresholds, opts) {
14228
14228
  runId: run.id,
14229
14229
  // В ЛЕНТУ, не пушем (TASWM-417). Раньше тут стоял "decision" с обоснованием «рой
14230
14230
  // этого сам не расшивает» — оно перестало быть правдой ровно на том же пороге:
14231
- // wakeAuthorOnChanges поднимает автора (`--continue`), а нечем продолжать —
14232
- // свежего дрона на ту же ветку и тот же PR. Значит в момент, когда это правило
14231
+ // wakeAuthorOnChanges поднимает автора свежей сессией с брифом фикс-итерации
14232
+ // (TASWM-539; до неё — `--continue`). Значит в момент, когда это правило
14233
14233
  // созревает, рой УЖЕ действует, и пуш звал бы человека к работе, которую делают
14234
14234
  // без него — ровно тот шум, из-за которого настоящие сигналы тонут. Настоящий
14235
14235
  // «нужен человек» приходит отдельно и позже: рой исчерпал побудки (маркер
@@ -17580,6 +17580,7 @@ var CHANGES_WAKE_COOLDOWN_MS = Number(process.env.SWARM_CHANGES_WAKE_COOLDOWN_MS
17580
17580
  var CHANGES_WAKE_LIMIT = Number(process.env.SWARM_CHANGES_WAKE_LIMIT) || 2;
17581
17581
  var CHANGES_FRESH_WAKE_AFTER_MS = Number(process.env.SWARM_CHANGES_FRESH_WAKE_AFTER_MS) || SWARM_ANOMALY_PR_NO_REVIEWER_MS;
17582
17582
  var CHANGES_WAKE_MARK = "\u0444\u0438\u043A\u0441-\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044F \u043F\u043E \u0432\u0435\u0440\u0434\u0438\u043A\u0442\u0443 \xAB\u043D\u0443\u0436\u043D\u044B \u043F\u0440\u0430\u0432\u043A\u0438\xBB";
17583
+ var CHANGES_FIX_COST_MARK = "\u0442\u0440\u0430\u0442\u044B \u0434\u043E \u0444\u0438\u043A\u0441-\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438";
17583
17584
  var CHANGES_WAKE_FAILED_MARK = "\u043F\u043E\u0431\u0443\u0434\u043A\u0430 \u0441\u043E\u0440\u0432\u0430\u043B\u0430\u0441\u044C";
17584
17585
  var BUDGET_STOP_REASON = "\u043D\u0435 \u0443\u043B\u043E\u0436\u0438\u043B\u0441\u044F \u0432 \u043F\u043E\u0442\u043E\u043B\u043E\u043A \u0442\u0440\u0430\u0442: \u0441\u0435\u0441\u0441\u0438\u044E \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u043B \u0431\u044E\u0434\u0436\u0435\u0442 \u043F\u0440\u043E\u0433\u043E\u043D\u0430";
17585
17586
  var NO_AUTO_WAKE_REASONS = [EXITED_NO_DONE_REASON, BUDGET_STOP_REASON, ABORTED_STOP_REASON];
@@ -18102,19 +18103,55 @@ function buildCiReadyNudge(prUrl, over) {
18102
18103
  "\u0412\u043E\u043F\u0440\u043E\u0441\u043E\u0432 \u0432 stdout \u043D\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0439 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0435\u0440\u0435\u0437 MCP-\u0442\u0443\u043B ask."
18103
18104
  ].join("\n");
18104
18105
  }
18105
- function buildChangesWakeNudge(prUrl, priorReview) {
18106
+ function buildChangesFixPrompt(args) {
18107
+ const { prUrl, slug, branch, base: base3, worktree, verdict } = args;
18108
+ const baseRef = base3 ? `origin/${base3}` : "origin/HEAD";
18106
18109
  return [
18107
- `\u{1F7E0} \u0420\u0435\u0432\u044C\u044E\u0435\u0440 \u0432\u044B\u043D\u0435\u0441 \u043F\u043E \u0442\u0432\u043E\u0435\u043C\u0443 PR ${prUrl} \u0432\u0435\u0440\u0434\u0438\u043A\u0442 REQUEST CHANGES (\xAB\u043D\u0443\u0436\u043D\u044B \u043F\u0440\u0430\u0432\u043A\u0438\xBB) \u2014 \u0440\u043E\u0439 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u043B \u0442\u0435\u0431\u044F \u043D\u0430 \u0444\u0438\u043A\u0441-\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044E.`,
18110
+ `\u0422\u044B \u2014 \u0434\u0440\u043E\u043D ${args.name || "\u0440\u043E\u044F"}, headless-\u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C (\u041D\u0415 \u0438\u043D\u0442\u0435\u0440\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0447\u0430\u0442). \u041A\u043E\u043C\u043C\u0438\u0442\u044B \u043F\u043E\u0434\u043F\u0438\u0441\u0430\u043D\u044B \u044D\u0442\u0438\u043C \u0438\u043C\u0435\u043D\u0435\u043C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.`,
18108
18111
  "",
18109
- priorReview ? `\u0427\u0442\u043E \u043F\u0440\u043E\u0441\u0438\u043B\u0438 \u043F\u043E\u0447\u0438\u043D\u0438\u0442\u044C:
18110
- ${priorReview}` : `\u0417\u0430\u043C\u0435\u0447\u0430\u043D\u0438\u044F \u2014 \u0432 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0445 PR: \`gh pr view ${prUrl} --comments\`.`,
18112
+ HEADLESS_BLOCK,
18113
+ "",
18114
+ `\u{1F7E0} \u0424\u0418\u041A\u0421-\u0418\u0422\u0415\u0420\u0410\u0426\u0418\u042F \u043F\u043E ${slug}. \u0420\u0435\u0432\u044C\u044E\u0435\u0440 \u0432\u044B\u043D\u0435\u0441 \u043F\u043E PR ${prUrl} \u0432\u0435\u0440\u0434\u0438\u043A\u0442 \xAB\u043D\u0443\u0436\u043D\u044B \u043F\u0440\u0430\u0432\u043A\u0438\xBB.`,
18115
+ "",
18116
+ "\u0422\u044B \u0421\u0412\u0415\u0416\u0418\u0419 \u0434\u0440\u043E\u043D \u043D\u0430 \u0423\u0416\u0415 \u0421\u0414\u0415\u041B\u0410\u041D\u041D\u041E\u0419 \u0440\u0430\u0431\u043E\u0442\u0435. \u0417\u0430\u0434\u0430\u0447\u0430 \u043D\u0435 \u043F\u0435\u0440\u0435\u0434\u0435\u043B\u044B\u0432\u0430\u0435\u0442\u0441\u044F: \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043B\u0435\u0436\u0438\u0442 \u0432 \u0432\u0435\u0442\u043A\u0435, PR \u043E\u0442\u043A\u0440\u044B\u0442, \u0440\u0435\u0432\u044C\u044E \u0435\u0451 \u043F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u043B\u043E. \u0422\u0432\u043E\u0451 \u0434\u0435\u043B\u043E \u2014 \u0437\u0430\u043A\u0440\u044B\u0442\u044C \u0437\u0430\u043C\u0435\u0447\u0430\u043D\u0438\u044F, \u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0438\u0445. \u041D\u0438\u0447\u0435\u0433\u043E \xAB\u0437\u0430\u043E\u0434\u043D\u043E\xBB \u043D\u0435 \u0443\u043B\u0443\u0447\u0448\u0430\u0435\u043C: \u043F\u043E\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u044F\u044F \u043F\u0440\u0430\u0432\u043A\u0430 \u0432 \u044D\u0442\u043E\u043C \u0437\u0430\u0445\u043E\u0434\u0435 \u0441\u0442\u043E\u0438\u0442 \u0432\u0442\u043E\u0440\u043E\u0433\u043E \u043A\u0440\u0443\u0433\u0430 \u0440\u0435\u0432\u044C\u044E \u0432\u0441\u0435\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u0435.",
18117
+ "",
18118
+ `\u0417\u0430\u0434\u0430\u0447\u0430: ${slug}${args.taskTitle ? ` \u2014 ${args.taskTitle}` : ""}`,
18119
+ // Ссылки может не быть (get_task отдал null / у задачи нет url) — тогда её нигде и не
18120
+ // обещаем: указание «открой ссылку выше» висело бы в воздухе. Канал дочитать постановку
18121
+ // от этого не пропадает — read_task() ниже работает всегда.
18122
+ ...args.taskUrl ? [`\u041F\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430: ${args.taskUrl}`] : [],
18123
+ `\u0412\u0435\u0442\u043A\u0430: ${branch} (\u0431\u0430\u0437\u0430 ${baseRef}) \xB7 PR: ${prUrl}`,
18124
+ `\u041A\u0430\u0442\u0430\u043B\u043E\u0433: ${worktree}`,
18125
+ "",
18126
+ "## \u0427\u0442\u043E \u043F\u0440\u043E\u0441\u0438\u043B \u0440\u0435\u0432\u044C\u044E\u0435\u0440",
18127
+ verdict ?? "\u0412\u0435\u0440\u0434\u0438\u043A\u0442 \u043D\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u043B\u0441\u044F \u0432 \u043B\u0435\u043D\u0442\u0435 \u2014 \u0447\u0438\u0442\u0430\u0439 \u0435\u0433\u043E \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u043E\u043C \u0432 PR (\u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u043D\u0438\u0436\u0435).",
18128
+ "",
18129
+ "## \u0412\u0432\u0435\u0434\u0438 \u0441\u0435\u0431\u044F \u0432 \u043A\u0443\u0440\u0441 \u0421\u0410\u041C \u2014 \u043F\u0430\u043C\u044F\u0442\u0438 \u043F\u0440\u043E\u0448\u043B\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0443 \u0442\u0435\u0431\u044F \u043D\u0435\u0442",
18130
+ "```",
18131
+ `gh pr view ${prUrl} --comments # \u0412\u0421\u0415 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438: \u0432\u0435\u0440\u0434\u0438\u043A\u0442, \u0437\u0430\u043C\u0435\u0447\u0430\u043D\u0438\u044F \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430, \u043E\u0442\u0432\u0435\u0442\u044B`,
18132
+ `git diff ${baseRef}...HEAD # \u0447\u0442\u043E \u0443\u0436\u0435 \u0441\u0434\u0435\u043B\u0430\u043D\u043E \u0432 \u0432\u0435\u0442\u043A\u0435`,
18133
+ `git log --oneline ${baseRef}..HEAD`,
18134
+ "git status # \u041D\u0415\u0417\u0410\u041A\u041E\u041C\u041C\u0418\u0427\u0415\u041D\u041D\u041E\u0415 \u043E\u0442 \u043F\u0440\u043E\u0448\u043B\u043E\u0439 \u043F\u043E\u043F\u044B\u0442\u043A\u0438, \u0435\u0441\u043B\u0438 \u043E\u043D\u0430 \u0431\u044B\u043B\u0430",
18135
+ `cat journal/${slug}.md # \u0440\u0435\u0448\u0435\u043D\u0438\u044F \u0430\u0432\u0442\u043E\u0440\u0430 \u0438 \u0438\u0445 \u043F\u0440\u0438\u0447\u0438\u043D\u044B (\u0435\u0441\u043B\u0438 \u0444\u0430\u0439\u043B \u0435\u0441\u0442\u044C)`,
18136
+ `ls ${ATTACHMENTS_DIR} # \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438 (\u0441\u043A\u0440\u0438\u043D\u044B, \u043C\u0430\u043A\u0435\u0442\u044B) \u2014 \u0435\u0441\u043B\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u0443\u0446\u0435\u043B\u0435\u043B`,
18137
+ "```",
18138
+ "\u0422\u0435\u043B\u043E \u0437\u0430\u0434\u0430\u0447\u0438 \u0446\u0435\u043B\u0438\u043A\u043E\u043C \u043D\u0443\u0436\u043D\u043E \u0440\u0435\u0434\u043A\u043E \u2014 \u043E\u043D\u043E \u0443\u0436\u0435 \u0440\u0435\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u043E. \u041F\u043E\u043D\u0430\u0434\u043E\u0431\u0438\u043B\u043E\u0441\u044C \u2014 \u043F\u0435\u0440\u0435\u0437\u0432\u043E\u043D\u0438 read_task(): \u043E\u043D \u043E\u0442\u0434\u0430\u0451\u0442 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435, \u041A\u0420\u0418\u0422\u0415\u0420\u0418\u0418 \u0413\u041E\u0422\u041E\u0412\u041D\u041E\u0421\u0422\u0418, \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u044B \u0438 \u043F\u0440\u0438\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u044B (\u0441\u043F\u0435\u043A\u0430 \u0436\u0438\u0432\u0451\u0442 \u0442\u0430\u043C). \u0412 \u0431\u0440\u0438\u0444\u0435 \u0438\u0445 \u043D\u0435\u0442 \u043D\u0430\u043C\u0435\u0440\u0435\u043D\u043D\u043E, \u0442\u0430\u043A \u0447\u0442\u043E \xAB\u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043F\u0440\u043E \u044D\u0442\u043E \u043D\u0435 \u0441\u043A\u0430\u0437\u0430\u043D\u043E\xBB \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0439 \u0447\u0435\u0440\u0435\u0437 \u043D\u0435\u0433\u043E, \u0430 \u043D\u0435 \u043F\u043E \u043F\u0430\u043C\u044F\u0442\u0438.",
18111
18139
  "",
18112
- "\u0422\u044B headless-\u0434\u0440\u043E\u043D, \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0435\u0448\u044C \u0422\u0423 \u0416\u0415 \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u0442\u043E\u043C \u0436\u0435 worktree. \u0413\u043B\u044F\u043D\u044C `git log`/`git status` \u2014 \u0441\u0434\u0435\u043B\u0430\u043D\u043D\u043E\u0435 \u041D\u0415 \u043F\u0435\u0440\u0435\u0434\u0435\u043B\u044B\u0432\u0430\u0439, \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0439 \u0438\u043C\u0435\u043D\u043D\u043E \u0437\u0430\u043C\u0435\u0447\u0430\u043D\u0438\u044F.",
18113
- "\u041F\u043E\u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0447\u0438\u043D\u0438 \u2192 \u043F\u0440\u043E\u0433\u043E\u043D\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u2192 \u0437\u0430\u043A\u043E\u043C\u043C\u0438\u0442\u044C \u0438 \u0437\u0430\u043F\u0443\u0448\u044C \u0432 \u0422\u0423 \u0416\u0415 \u0432\u0435\u0442\u043A\u0443 (\u0438\u0441\u0442\u043E\u0440\u0438\u044F/force-push \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D\u044B) \u2192 \u041E\u0411\u042F\u0417\u0410\u0422\u0415\u041B\u042C\u041D\u041E \u0432\u044B\u0437\u043E\u0432\u0438 done(pr_url) \u0441 \u0442\u043E\u0439 \u0436\u0435 \u0441\u0441\u044B\u043B\u043A\u043E\u0439. \u0418\u043C\u0435\u043D\u043D\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u0439 done() \u043F\u043E\u0434\u043D\u0438\u043C\u0430\u0435\u0442 \u0440\u0435-\u0440\u0435\u0432\u044C\u044E\u0435\u0440\u0430; \u0431\u0435\u0437 \u043D\u0435\u0433\u043E \u0444\u0438\u043A\u0441 \u043D\u0435 \u0437\u0430\u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F, \u0430 \u0442\u0432\u043E\u0439 \u0432\u044B\u0445\u043E\u0434 \u0440\u043E\u0439 \u043F\u0440\u0438\u043C\u0435\u0442 \u0437\u0430 \u0441\u043C\u0435\u0440\u0442\u044C.",
18114
- // TASWM-293: именно сюда дрон и приходил с вердиктом «нет CI на коммите» — по коду
18115
- // замечаний не было, и он «закрыл» их, заведя workflow в чужом репозитории.
18116
- "\u0417\u0430\u043C\u0435\u0447\u0430\u043D\u0438\u0435 \u043D\u0435 \u043F\u0440\u043E \u0442\u0432\u043E\u0439 \u043A\u043E\u0434, \u0430 \u043F\u0440\u043E \u0418\u041D\u0424\u0420\u0410\u0421\u0422\u0420\u0423\u041A\u0422\u0423\u0420\u0423 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F (\u043D\u0435\u0442 CI, \u0447\u0443\u0436\u043E\u0439 \u043A\u0440\u0430\u0441\u043D\u044B\u0439 \u0447\u0435\u043A, \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u0435)? \u0418\u043D\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u041D\u0415 \u0447\u0438\u043D\u0438 \u0438 workflow \u043D\u0435 \u0437\u0430\u0432\u043E\u0434\u0438 \u2014 \u044D\u0442\u043E \u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0432\u043B\u0430\u0434\u0435\u043B\u044C\u0446\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u0430: \u0432\u044B\u0437\u043E\u0432\u0438 note(text) \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0443, \u043E\u0431\u044A\u044F\u0441\u043D\u0438 \u044D\u0442\u043E \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u043E\u043C \u0432 PR \u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043D\u043E \u043F\u043E\u0437\u043E\u0432\u0438 done() \u0441 \u0442\u043E\u0439 \u0436\u0435 \u0441\u0441\u044B\u043B\u043A\u043E\u0439.",
18117
- "\u041D\u0435 \u0441\u043E\u0433\u043B\u0430\u0441\u0435\u043D \u0441 \u0437\u0430\u043C\u0435\u0447\u0430\u043D\u0438\u0435\u043C \u2014 \u043D\u0435 \u043C\u043E\u043B\u0447\u0438 \u0438 \u043D\u0435 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0439: \u043E\u0431\u044A\u044F\u0441\u043D\u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u043E\u043C \u0432 PR \u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043D\u043E \u043F\u043E\u0437\u043E\u0432\u0438 done(). \u0412\u043E\u043F\u0440\u043E\u0441\u043E\u0432 \u0432 stdout \u043D\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0439 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0435\u0440\u0435\u0437 MCP-\u0442\u0443\u043B ask."
18140
+ "## \u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B overmind (MCP)",
18141
+ "`done(pr_url, summary, screenshots?)` \u2014 \u0441\u0434\u0430\u0447\u0430; `report_step(text)` \u2014 \u043B\u043E\u0433 \u0445\u043E\u0434\u0430; `read_task()` \u2014 \u0441\u0432\u0435\u0436\u0438\u0439 \u0441\u043D\u0430\u043F\u0448\u043E\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 (\u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 + \u043A\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u0438 + \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u044B + \u0434\u043E\u043A\u0438); `ask(question, options?)` \u2014 \u0443\u043F\u0451\u0440\u0441\u044F \u0432 \u0420\u0415\u0428\u0415\u041D\u0418\u0415, \u0441\u043F\u0440\u043E\u0441\u0438 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430 \u0438 \u0434\u043E\u0436\u0434\u0438\u0441\u044C \u043E\u0442\u0432\u0435\u0442\u0430 (\u043D\u0435 \u0443\u0433\u0430\u0434\u044B\u0432\u0430\u0439); `note(text)` \u2014 \u0437\u0430\u043C\u0435\u0442\u043A\u0430 \xAB\u0437\u0430\u043C\u0435\u0447\u0435\u043D\u043E \u043F\u043E \u043F\u0443\u0442\u0438\xBB \u0431\u0435\u0437 \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0438; `report_acceptance_check(id, state, evidence)` \u2014 \u0435\u0441\u043B\u0438 \u043F\u0440\u0430\u0432\u043A\u0430 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043F\u0443\u043D\u043A\u0442 \u043A\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432 \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u0438 (id \u0431\u0440\u0430\u0442\u044C \u0438\u0437 \u0431\u043B\u043E\u043A\u0430 \xAB\u041A\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u0438\xBB \u0432 \u043E\u0442\u0432\u0435\u0442\u0435 read_task).",
18142
+ "`report_weight(note)` \u2014 \u0441\u043A\u0430\u0436\u0438, \u0447\u0442\u043E \u0440\u0430\u0431\u043E\u0442\u0430 \u0442\u044F\u0436\u0435\u043B\u0435\u0435 \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u0439, \u0415\u0421\u041B\u0418 \u0441\u0436\u0451\u0433 \u0431\u043E\u043B\u044C\u0448\u0435 \u043F\u043E\u043B\u043E\u0432\u0438\u043D\u044B \u0431\u044E\u0434\u0436\u0435\u0442\u0430, \u0430 \u0434\u043E \u0441\u0434\u0430\u0447\u0438 \u0434\u0430\u043B\u0435\u043A\u043E: \u0434\u0435\u043C\u043E\u043D \u043F\u043E\u0434\u043D\u0438\u043C\u0435\u0442 \u043F\u043E\u0442\u043E\u043B\u043E\u043A \u0432 \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u0435\u043B\u0430\u0445. \u0417\u043E\u0432\u0438 \u041F\u041E \u0425\u041E\u0414\u0423 \u2014 \u043F\u043E\u0441\u0442\u0444\u0430\u043A\u0442\u0443\u043C \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u0442\u044C \u043D\u0435\u0447\u0435\u0433\u043E.",
18143
+ "",
18144
+ "## \u041F\u043E\u0440\u044F\u0434\u043E\u043A",
18145
+ "\u041F\u043E\u0447\u0438\u043D\u0438 \u2192 \u043F\u0440\u043E\u0433\u043E\u043D\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u2192 \u043C\u0435\u043D\u044F\u043B \u0432\u0438\u0434\u0438\u043C\u044B\u0439 UI \u2014 \u0441\u043D\u0438\u043C\u0438 \u0441\u043A\u0440\u0438\u043D\u044B \u2192 \u0437\u0430\u043A\u043E\u043C\u043C\u0438\u0442\u044C \u0438 \u0437\u0430\u043F\u0443\u0448\u044C \u0432 \u0422\u0423 \u0416\u0415 \u0432\u0435\u0442\u043A\u0443 (\u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u0438 force-push \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D\u044B) \u2192 \u041E\u0411\u042F\u0417\u0410\u0422\u0415\u041B\u042C\u041D\u041E \u0432\u044B\u0437\u043E\u0432\u0438 done(pr_url) \u0441 \u0442\u043E\u0439 \u0436\u0435 \u0441\u0441\u044B\u043B\u043A\u043E\u0439.",
18146
+ `\u{1F4B8} \u0411\u044E\u0434\u0436\u0435\u0442 \u044D\u0442\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u2014 \u041E\u0421\u0422\u0410\u0422\u041E\u041A \u043F\u043E\u0442\u043E\u043B\u043A\u0430 \u043F\u0440\u043E\u0433\u043E\u043D\u0430, \u0430 \u043D\u0435 \u043F\u043E\u043B\u043D\u044B\u0439 \u043F\u043E\u0442\u043E\u043B\u043E\u043A: \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u0439 \u0437\u0430\u0445\u043E\u0434 \u0443\u0436\u0435 \u043F\u043E\u0442\u0440\u0430\u0442\u0438\u043B \u0447\u0430\u0441\u0442\u044C, \u0438 \u0442\u0435\u0431\u0435 \u0434\u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C \u0442\u043E, \u0447\u0442\u043E \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C. \u041F\u043E\u044D\u0442\u043E\u043C\u0443 \u043A\u043E\u043C\u043C\u0438\u0442\u044C \u0438 \u043F\u0443\u0448\u044C \u041F\u041E \u0425\u041E\u0414\u0423, \u043F\u043E\u0441\u043B\u0435 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0438\u043C\u043E\u0433\u043E \u0448\u0430\u0433\u0430, \u0430 \u043D\u0435 \u043E\u0434\u043D\u0438\u043C \u043A\u0443\u0441\u043A\u043E\u043C \u0432 \u043A\u043E\u043D\u0446\u0435: \u043D\u0435\u0437\u0430\u043F\u0443\u0448\u0435\u043D\u043D\u043E\u0435 \u0443\u043C\u0438\u0440\u0430\u0435\u0442 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0441\u0435\u0441\u0441\u0438\u0435\u0439. \u0421\u043B\u0430\u0433 ${slug} \u2014 \u0432 \u041A\u0410\u0416\u0414\u041E\u041C commit-\u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0438 (\u043F\u043E \u0441\u043B\u0430\u0433\u0430\u043C \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u0440\u0435\u043B\u0438\u0437, \u0438 \u043F\u0440\u043E\u0434\u0443\u043A\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442 \u044D\u0442\u043E \u0441\u0430\u043C).`,
18147
+ "\u0418\u043C\u0435\u043D\u043D\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u0439 done() \u043F\u043E\u0434\u043D\u0438\u043C\u0430\u0435\u0442 \u0440\u0435-\u0440\u0435\u0432\u044C\u044E\u0435\u0440\u0430. \u0411\u0435\u0437 \u043D\u0435\u0433\u043E \u043F\u0440\u0430\u0432\u043A\u0430 \u043D\u0435 \u0437\u0430\u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F, \u0430 \u0442\u0432\u043E\u0439 \u0432\u044B\u0445\u043E\u0434 \u0440\u043E\u0439 \u043F\u0440\u0438\u043C\u0435\u0442 \u0437\u0430 \u0441\u043C\u0435\u0440\u0442\u044C.",
18148
+ ...args.verifyMode === "ci" ? ["\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0438: \u0440\u0435\u0436\u0438\u043C `ci` \u2014 \u0431\u044B\u0441\u0442\u0440\u044B\u0439 typecheck \u0438 \u0442\u0435\u0441\u0442\u044B \u043F\u043E \u0441\u0432\u043E\u0435\u0439 \u043F\u0440\u0430\u0432\u043A\u0435, \u0442\u044F\u0436\u0451\u043B\u043E\u0435 \u0434\u043E\u0441\u0447\u0438\u0442\u0430\u0435\u0442 CI \u043D\u0430 PR."] : ["\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0438: \u0440\u0435\u0436\u0438\u043C `local` \u2014 \u043F\u0440\u043E\u0433\u043E\u043D\u0438 \u0442\u043E, \u0447\u0442\u043E \u043F\u043E\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043F\u0440\u0430\u0432\u043A\u0443, \u0438 \u0441\u044C\u044E\u0442 \u0441\u0432\u043E\u0435\u0433\u043E \u043F\u0430\u043A\u0435\u0442\u0430 \u043F\u0435\u0440\u0435\u0434 \u0441\u0434\u0430\u0447\u0435\u0439."],
18149
+ `\u0422\u0440\u043E\u043D\u0443\u043B \u0432\u0438\u0434\u0438\u043C\u044B\u0439 UI \u2014 \u0441\u043A\u0440\u0438\u043D\u044B \u041E\u0411\u042F\u0417\u0410\u0422\u0415\u041B\u042C\u041D\u042B \u0438 \u0438\u0434\u0443\u0442 \u0412 \u0417\u0410\u0414\u0410\u0427\u0423: \`swarm shot <url> <out-prefix>\` (\u0441\u0430\u043C \u0441\u043D\u0438\u043C\u0430\u0435\u0442 mobile+desktop), \u043F\u0443\u0442\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0439 \u0432 done(pr_url, summary, screenshots: [...]). \u0425\u0430\u0440\u0434-\u043B\u0438\u043C\u0438\u0442 \u043D\u0430 \u0448\u0430\u0433 \u2014 5 \u043C\u0438\u043D\u0443\u0442: \u043D\u0435 \u0443\u043B\u043E\u0436\u0438\u043B\u0441\u044F \u2014 \u043D\u0430\u043F\u0438\u0448\u0438 \u044D\u0442\u043E \u0432 PR \u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043D\u043E \u0437\u043E\u0432\u0438 done(). \u0417\u0430\u0434\u0430\u0447\u0430 \u0431\u0435\u0437 \u0441\u043A\u0440\u0438\u043D\u043E\u0432 \u043F\u0440\u0438\u0451\u043C\u043A\u0443 \u043D\u0435 \u043F\u0440\u043E\u0445\u043E\u0434\u0438\u0442.`,
18150
+ `\u0414\u043E\u043F\u0438\u0448\u0438 \u0432 \`journal/${slug}.md\` \u043A\u043E\u0440\u043E\u0442\u043A\u0438\u0439 \u0431\u043B\u043E\u043A \u043F\u0440\u043E \u044D\u0442\u043E\u0442 \u0437\u0430\u0445\u043E\u0434 \u2014 \u0447\u0442\u043E \u043F\u0440\u043E\u0441\u0438\u043B\u0438 \u0438 \u043A\u0430\u043A \u0437\u0430\u043A\u0440\u044B\u043B \u2014 \u0438 \u0437\u0430\u043A\u043E\u043C\u043C\u0438\u0442\u044C \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u043F\u0440\u0430\u0432\u043A\u043E\u0439. \u042D\u0442\u043E \u0445\u0440\u043E\u043D\u0438\u043A\u0430 \u0437\u0430\u0434\u0430\u0447\u0438, \u0430 \u043D\u0435 \u043E\u0442\u0447\u0451\u0442: \u043E\u043D \u0438\u0434\u0451\u0442 \u0432 summary \u0443 done().`,
18151
+ "",
18152
+ "## \u0413\u0440\u0430\u043D\u0438\u0446\u044B",
18153
+ "\u0417\u0430\u043C\u0435\u0447\u0430\u043D\u0438\u0435 \u043F\u0440\u043E \u0418\u041D\u0424\u0420\u0410\u0421\u0422\u0420\u0423\u041A\u0422\u0423\u0420\u0423 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F (\u043D\u0435\u0442 CI, \u0447\u0443\u0436\u043E\u0439 \u043A\u0440\u0430\u0441\u043D\u044B\u0439 \u0447\u0435\u043A, \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u0435) \u2014 \u043D\u0435 \u0447\u0438\u043D\u0438 \u0438 workflow \u043D\u0435 \u0437\u0430\u0432\u043E\u0434\u0438: \u044D\u0442\u043E \u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0432\u043B\u0430\u0434\u0435\u043B\u044C\u0446\u0430. \u0412\u044B\u0437\u043E\u0432\u0438 note(text), \u043E\u0431\u044A\u044F\u0441\u043D\u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u043E\u043C \u0432 PR \u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043D\u043E \u043F\u043E\u0437\u043E\u0432\u0438 done() \u0441 \u0442\u043E\u0439 \u0436\u0435 \u0441\u0441\u044B\u043B\u043A\u043E\u0439.",
18154
+ "\u041D\u0435 \u0441\u043E\u0433\u043B\u0430\u0441\u0435\u043D \u0441 \u0437\u0430\u043C\u0435\u0447\u0430\u043D\u0438\u0435\u043C \u2014 \u043D\u0435 \u043C\u043E\u043B\u0447\u0438 \u0438 \u043D\u0435 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0439: \u043E\u0431\u044A\u044F\u0441\u043D\u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u043E\u043C \u0432 PR \u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043D\u043E \u043F\u043E\u0437\u043E\u0432\u0438 done()."
18118
18155
  ].join("\n");
18119
18156
  }
18120
18157
  var HERO_CONTINUE_NUDGE = "\u0422\u0435\u0431\u044F \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u043B\u0438, \u0413\u0435\u0440\u043E\u0439: \u0432 \u043E\u0442\u0440\u044F\u0434\u0435 \u0447\u0442\u043E-\u0442\u043E \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u043E (\u0434\u0440\u043E\u043D \u0437\u0430\u0434\u0430\u043B \u0432\u043E\u043F\u0440\u043E\u0441, \u0441\u0434\u0430\u043B PR \u0438\u043B\u0438 \u0443\u043C\u0435\u0440) \u2014 \u043B\u0438\u0431\u043E \u0442\u0435\u0431\u044F \u043F\u043E\u0437\u0432\u0430\u043B \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440. \u0422\u044B headless, \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0435\u0448\u044C \u0422\u041E\u0422 \u0416\u0415 \u044D\u043F\u0438\u043A: \u0443\u0441\u0442\u0430\u0432 \u0438 \u0442\u0435\u043B\u043E \u044D\u043F\u0438\u043A\u0430 \u0443\u0436\u0435 \u0432 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0435 \u043F\u0440\u043E\u0448\u043B\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0438. \u0413\u043B\u044F\u043D\u044C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u043E\u0442\u0440\u044F\u0434\u0430 (squad_status) \u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0438\u0441\u044C, \u0447\u0442\u043E \u0438\u0437\u043C\u0435\u043D\u0438\u043B\u043E\u0441\u044C: \u0442\u0435\u0445\u043D\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0432\u043E\u043F\u0440\u043E\u0441\u044B \u0434\u0440\u043E\u043D\u043E\u0432 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0439 answer_drone; \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u043E\u0432\u043E\u0435/\u0434\u0438\u0437\u0430\u0439\u043D/scope \u2014 \u044D\u0441\u043A\u0430\u043B\u0438\u0440\u0443\u0439 \u0447\u0435\u0440\u0435\u0437 ask. \u041A\u043E\u0434 \u043D\u0435 \u043F\u0438\u0448\u0438, PR \u043D\u0435 \u043C\u0435\u0440\u0436\u0438, done \u041D\u0415 \u0437\u043E\u0432\u0438. \u0420\u0430\u0437\u043E\u0431\u0440\u0430\u043B\u0441\u044F \u0441 \u0440\u044B\u0432\u043A\u043E\u043C \u2014 \u0441\u043D\u043E\u0432\u0430 \u0437\u043E\u0432\u0438 rest(summary) \u0438 \u0437\u0430\u043C\u0440\u0438. \u0412\u043E\u043F\u0440\u043E\u0441\u043E\u0432 \u0432 stdout \u043D\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0439 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0435\u0440\u0435\u0437 ask.";
@@ -18905,18 +18942,15 @@ async function wakeAuthorOnChanges(deps, run, now, droneCap) {
18905
18942
  }
18906
18943
  }
18907
18944
  const wt = run.worktree_path;
18908
- const mode = wt && worktreeAndTranscriptAlive(deps, wt) ? "continue" : "fresh";
18909
- if (mode === "fresh" && !await freshChangesWakeAllowed(deps, run, prUrl, now)) return false;
18910
- const nudge = buildChangesWakeNudge(prUrl, lastChangesSummary(deps.db, run.id));
18945
+ const worktreeReady = !!wt && (deps.worktreeExists ?? existsSync20)(wt);
18946
+ if (!worktreeReady && !await freshChangesWakeAllowed(deps, run, prUrl, now)) return false;
18911
18947
  try {
18912
- await deps.respawn(run, mode, nudge);
18948
+ await deps.respawn(run, "fix");
18949
+ deps.db.addEvent(run.id, "step", `${CHANGES_FIX_COST_MARK}: $${(run.cost_usd ?? 0).toFixed(2)}`);
18913
18950
  if (run.stop_reason != null) deps.db.updateRun(run.id, { stop_reason: null });
18914
- const how = mode === "continue" ? "\u0431\u0443\u0436\u0443 \u0430\u0432\u0442\u043E\u0440\u0430 (--continue) \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0437\u0430\u043C\u0435\u0447\u0430\u043D\u0438\u044F" : "\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0442\u044C \u043D\u0435\u0447\u0435\u043C (worktree/\u0441\u0435\u0441\u0441\u0438\u044F \u043F\u043E\u0442\u0435\u0440\u044F\u043D\u044B) \u2014 \u043F\u043E\u0434\u043D\u0438\u043C\u0430\u044E \u0441\u0432\u0435\u0436\u0435\u0433\u043E \u0434\u0440\u043E\u043D\u0430 \u043D\u0430 \u0442\u0443 \u0436\u0435 \u0432\u0435\u0442\u043A\u0443 \u0438 \u0442\u043E\u0442 \u0436\u0435 PR";
18951
+ const how = worktreeReady ? "\u0441\u0432\u0435\u0436\u0438\u0439 \u0434\u0440\u043E\u043D \u0441 \u0431\u0440\u0438\u0444\u043E\u043C \u0444\u0438\u043A\u0441-\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0442\u043E\u043C \u0436\u0435 worktree" : "\u0441\u0432\u0435\u0436\u0438\u0439 \u0434\u0440\u043E\u043D \u0441 \u0431\u0440\u0438\u0444\u043E\u043C \u0444\u0438\u043A\u0441-\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438, worktree \u043F\u0435\u0440\u0435-\u0441\u043E\u0437\u0434\u0430\u0451\u0442\u0441\u044F \u0441 origin";
18915
18952
  deps.db.addEvent(run.id, "resumed", `${CHANGES_WAKE_MARK} \u2014 ${how}`);
18916
- narrate(
18917
- deps,
18918
- mode === "continue" ? `\u0420\u0435\u0432\u044C\u044E\u0435\u0440 \u043F\u043E\u043F\u0440\u043E\u0441\u0438\u043B \u043F\u0440\u0430\u0432\u043A\u0438 \u0443 ${droneLabel(run)} \u2014 \u0431\u0443\u0436\u0443 \u0430\u0432\u0442\u043E\u0440\u0430 \u043D\u0430 \u0444\u0438\u043A\u0441-\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044E.` : `\u0420\u0435\u0432\u044C\u044E\u0435\u0440 \u043F\u043E\u043F\u0440\u043E\u0441\u0438\u043B \u043F\u0440\u0430\u0432\u043A\u0438 \u0443 ${droneLabel(run)}, \u0430 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0442\u044C \u043D\u0435\u0447\u0435\u0433\u043E \u2014 \u043F\u043E\u0434\u043D\u0438\u043C\u0430\u044E \u0441\u0432\u0435\u0436\u0435\u0433\u043E \u0434\u0440\u043E\u043D\u0430 \u043D\u0430 \u0442\u0443 \u0436\u0435 \u0432\u0435\u0442\u043A\u0443.`
18919
- );
18953
+ narrate(deps, `\u0420\u0435\u0432\u044C\u044E\u0435\u0440 \u043F\u043E\u043F\u0440\u043E\u0441\u0438\u043B \u043F\u0440\u0430\u0432\u043A\u0438 \u0443 ${droneLabel(run)} \u2014 \u043F\u043E\u0434\u043D\u0438\u043C\u0430\u044E \u0441\u0432\u0435\u0436\u0435\u0433\u043E \u0434\u0440\u043E\u043D\u0430 \u043D\u0430 \u0444\u0438\u043A\u0441-\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044E.`);
18920
18954
  return true;
18921
18955
  } catch (e) {
18922
18956
  deps.db.addEvent(run.id, "resumed", `${CHANGES_WAKE_MARK}: ${CHANGES_WAKE_FAILED_MARK} \u2014 ${String(e)}`);
@@ -20889,7 +20923,7 @@ async function spawnVerifier(deps, verifiedRun, files) {
20889
20923
  }
20890
20924
  async function respawnRun(deps, run, mode, nudge) {
20891
20925
  const repo = normalizeRepo(run.repo || deps.repoFallback);
20892
- const wt = run.worktree_path || (mode === "fresh" ? droneWorktreePath(deps.worktreesDir, repo, run.task_slug) : null);
20926
+ const wt = run.worktree_path || (mode !== "continue" ? droneWorktreePath(deps.worktreesDir, repo, run.task_slug) : null);
20893
20927
  if (!wt) throw new Error(`\u043D\u0435\u0442 worktree_path \u0434\u043B\u044F \u043E\u0436\u0438\u0432\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u043E\u0433\u043E\u043D\u0430 #${run.id}`);
20894
20928
  if (!run.worktree_path && worktreePathHeldLive(deps.db, wt, run.id)) {
20895
20929
  throw new Error(`worktree ${wt} \u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0440\u0443\u0433\u043E\u0439 \u0436\u0438\u0432\u043E\u0439 \u043F\u0440\u043E\u0433\u043E\u043D \u2014 \u043E\u0436\u0438\u0432\u043B\u0435\u043D\u0438\u0435 #${run.id} \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u043E (TASWM-417)`);
@@ -20906,7 +20940,9 @@ async function respawnRun(deps, run, mode, nudge) {
20906
20940
  deps.baseBranch ? deps.baseBranch(repo) : Promise.resolve(""),
20907
20941
  // TASWM-466: память зоны — тем же параллельным чтением. Отвалилась → пустой список:
20908
20942
  // оживление дрона не должно зависеть от того, доехала ли подсказка.
20909
- deps.zoneMemory && run.area ? deps.zoneMemory(repo, run.area).catch(() => []) : Promise.resolve([])
20943
+ // TASWM-539: фикс-итерации память зоны не нужна — она про «как делать задачу в этой
20944
+ // зоне», а задача сделана. Лишний прод-вызов и лишний блок в контексте.
20945
+ deps.zoneMemory && run.area && mode !== "fix" ? deps.zoneMemory(repo, run.area).catch(() => []) : Promise.resolve([])
20910
20946
  ]);
20911
20947
  const base3 = effectiveBaseBranch(run.base_branch, projectBase);
20912
20948
  const runToSpawn = base3 && run.base_branch !== base3 ? deps.db.updateRun(run.id, { base_branch: base3 }) ?? run : run;
@@ -20923,14 +20959,25 @@ async function respawnRun(deps, run, mode, nudge) {
20923
20959
  }
20924
20960
  const depsReport = await ensureWorktreeDeps(wt);
20925
20961
  for (const text of depsEvents(depsReport)) deps.db.addEvent(run.id, "step", text);
20926
- const taskContext = task && deps.getTaskContext ? await deps.getTaskContext(task, run.workspace_id) : void 0;
20927
- const attachments = await prepareTaskAttachments({
20962
+ const taskContext = task && deps.getTaskContext && mode !== "fix" ? await deps.getTaskContext(task, run.workspace_id) : void 0;
20963
+ const attachments = mode === "fix" ? void 0 : await prepareTaskAttachments({
20928
20964
  worktree: wt,
20929
20965
  refs: task?.attachments,
20930
20966
  fetchFile: deps.fetchFile,
20931
20967
  onEvent: (text) => deps.db.addEvent(run.id, "step", text)
20932
20968
  });
20933
- const freshPrompt = runToSpawn.kind === "hero" ? buildHeroPrompt(task, runToSpawn, taskContext, attachments) : buildPrompt(task, runToSpawn, verifyMode, taskContext, attachments, renderZoneMemoryBlock(runToSpawn.area, zoneNotes));
20969
+ const freshPrompt = mode === "fix" ? buildChangesFixPrompt({
20970
+ prUrl: runToSpawn.pr_url ?? "",
20971
+ slug: runToSpawn.task_slug,
20972
+ branch: runToSpawn.branch || runToSpawn.task_slug,
20973
+ base: base3 || "",
20974
+ worktree: wt,
20975
+ verdict: lastChangesSummary(deps.db, runToSpawn.id),
20976
+ name: runToSpawn.name,
20977
+ taskTitle: task?.title ?? null,
20978
+ taskUrl: task?.url ?? null,
20979
+ ...verifyMode ? { verifyMode } : {}
20980
+ }) : runToSpawn.kind === "hero" ? buildHeroPrompt(task, runToSpawn, taskContext, attachments) : buildPrompt(task, runToSpawn, verifyMode, taskContext, attachments, renderZoneMemoryBlock(runToSpawn.area, zoneNotes));
20934
20981
  const notice = depsPromptNotice(depsReport);
20935
20982
  const prompt = [freshPrompt, notice, nudge].filter(Boolean).join("\n\n");
20936
20983
  const pid = deps.launch({ worktree: wt, run: runToSpawn, prompt });
@@ -22332,6 +22379,7 @@ export {
22332
22379
  ABORT_TEXT,
22333
22380
  AWAITING_CI_REASON,
22334
22381
  BUDGET_STOP_REASON,
22382
+ CHANGES_FIX_COST_MARK,
22335
22383
  CHANGES_FRESH_WAKE_AFTER_MS,
22336
22384
  CHANGES_WAKE_COOLDOWN_MS,
22337
22385
  CHANGES_WAKE_ESCALATION_MARK,
@@ -22388,7 +22436,7 @@ export {
22388
22436
  VERIFY_SPAWN_LIMIT,
22389
22437
  WATCHDOG_PARK_REASON,
22390
22438
  abortReason,
22391
- buildChangesWakeNudge,
22439
+ buildChangesFixPrompt,
22392
22440
  buildCiReadyNudge,
22393
22441
  buildCiWakeNudge,
22394
22442
  buildHeroPrompt,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taskless-app/swarm",
3
- "version": "0.6.35",
3
+ "version": "0.6.36",
4
4
  "type": "module",
5
5
  "description": "Local control plane for a fleet of AI coding agents (drones), coordinating through Taskless. The overmind runs the swarm.",
6
6
  "keywords": [
@@ -39,7 +39,7 @@
39
39
  "execa": "^10.0.0",
40
40
  "zod": "3.25.76"
41
41
  },
42
- "gitHead": "d17bb241cf5d92790e5050c85648b97657c6b795",
42
+ "gitHead": "2d673b2bafb12ef0ced20b2469d798f7ae712b3a",
43
43
  "scripts": {
44
44
  "overmind": "NODE_OPTIONS=\"${NODE_OPTIONS:-} --conditions=development\" tsx src/overmind.ts",
45
45
  "swarm": "NODE_OPTIONS=\"${NODE_OPTIONS:-} --conditions=development\" tsx src/cli.ts",