@taskless-app/swarm 0.6.35 → 0.6.37

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.37",
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: "3b1a04ef992f6bba42847d1dc29d22e39cadfc25"
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.37",
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: "3b1a04ef992f6bba42847d1dc29d22e39cadfc25"
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.",
18139
+ "",
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.",
18111
18143
  "",
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."
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,16 @@ 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 wtPath = wt || (deps.worktreesDir ? droneWorktreePath(deps.worktreesDir, normalizeRepo(run.repo || deps.repoFallback || ""), run.task_slug) : null);
18946
+ const worktreeReady = !!wtPath && (deps.worktreeExists ?? existsSync20)(wtPath);
18947
+ if (!worktreeReady && !await freshChangesWakeAllowed(deps, run, prUrl, now)) return false;
18911
18948
  try {
18912
- await deps.respawn(run, mode, nudge);
18949
+ await deps.respawn(run, "fix");
18950
+ deps.db.addEvent(run.id, "step", `${CHANGES_FIX_COST_MARK}: $${(run.cost_usd ?? 0).toFixed(2)}`);
18913
18951
  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";
18952
+ 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
18953
  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
- );
18954
+ 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
18955
  return true;
18921
18956
  } catch (e) {
18922
18957
  deps.db.addEvent(run.id, "resumed", `${CHANGES_WAKE_MARK}: ${CHANGES_WAKE_FAILED_MARK} \u2014 ${String(e)}`);
@@ -20889,7 +20924,7 @@ async function spawnVerifier(deps, verifiedRun, files) {
20889
20924
  }
20890
20925
  async function respawnRun(deps, run, mode, nudge) {
20891
20926
  const repo = normalizeRepo(run.repo || deps.repoFallback);
20892
- const wt = run.worktree_path || (mode === "fresh" ? droneWorktreePath(deps.worktreesDir, repo, run.task_slug) : null);
20927
+ const wt = run.worktree_path || (mode !== "continue" ? droneWorktreePath(deps.worktreesDir, repo, run.task_slug) : null);
20893
20928
  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
20929
  if (!run.worktree_path && worktreePathHeldLive(deps.db, wt, run.id)) {
20895
20930
  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 +20941,9 @@ async function respawnRun(deps, run, mode, nudge) {
20906
20941
  deps.baseBranch ? deps.baseBranch(repo) : Promise.resolve(""),
20907
20942
  // TASWM-466: память зоны — тем же параллельным чтением. Отвалилась → пустой список:
20908
20943
  // оживление дрона не должно зависеть от того, доехала ли подсказка.
20909
- deps.zoneMemory && run.area ? deps.zoneMemory(repo, run.area).catch(() => []) : Promise.resolve([])
20944
+ // TASWM-539: фикс-итерации память зоны не нужна — она про «как делать задачу в этой
20945
+ // зоне», а задача сделана. Лишний прод-вызов и лишний блок в контексте.
20946
+ deps.zoneMemory && run.area && mode !== "fix" ? deps.zoneMemory(repo, run.area).catch(() => []) : Promise.resolve([])
20910
20947
  ]);
20911
20948
  const base3 = effectiveBaseBranch(run.base_branch, projectBase);
20912
20949
  const runToSpawn = base3 && run.base_branch !== base3 ? deps.db.updateRun(run.id, { base_branch: base3 }) ?? run : run;
@@ -20923,14 +20960,25 @@ async function respawnRun(deps, run, mode, nudge) {
20923
20960
  }
20924
20961
  const depsReport = await ensureWorktreeDeps(wt);
20925
20962
  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({
20963
+ const taskContext = task && deps.getTaskContext && mode !== "fix" ? await deps.getTaskContext(task, run.workspace_id) : void 0;
20964
+ const attachments = mode === "fix" ? void 0 : await prepareTaskAttachments({
20928
20965
  worktree: wt,
20929
20966
  refs: task?.attachments,
20930
20967
  fetchFile: deps.fetchFile,
20931
20968
  onEvent: (text) => deps.db.addEvent(run.id, "step", text)
20932
20969
  });
20933
- const freshPrompt = runToSpawn.kind === "hero" ? buildHeroPrompt(task, runToSpawn, taskContext, attachments) : buildPrompt(task, runToSpawn, verifyMode, taskContext, attachments, renderZoneMemoryBlock(runToSpawn.area, zoneNotes));
20970
+ const freshPrompt = mode === "fix" ? buildChangesFixPrompt({
20971
+ prUrl: runToSpawn.pr_url ?? "",
20972
+ slug: runToSpawn.task_slug,
20973
+ branch: runToSpawn.branch || runToSpawn.task_slug,
20974
+ base: base3 || "",
20975
+ worktree: wt,
20976
+ verdict: lastChangesSummary(deps.db, runToSpawn.id),
20977
+ name: runToSpawn.name,
20978
+ taskTitle: task?.title ?? null,
20979
+ taskUrl: task?.url ?? null,
20980
+ ...verifyMode ? { verifyMode } : {}
20981
+ }) : runToSpawn.kind === "hero" ? buildHeroPrompt(task, runToSpawn, taskContext, attachments) : buildPrompt(task, runToSpawn, verifyMode, taskContext, attachments, renderZoneMemoryBlock(runToSpawn.area, zoneNotes));
20934
20982
  const notice = depsPromptNotice(depsReport);
20935
20983
  const prompt = [freshPrompt, notice, nudge].filter(Boolean).join("\n\n");
20936
20984
  const pid = deps.launch({ worktree: wt, run: runToSpawn, prompt });
@@ -21592,6 +21640,9 @@ async function runDaemon(opts) {
21592
21640
  });
21593
21641
  const deps = {
21594
21642
  db,
21643
+ // Корень worktree-ов: по нему гейт фикс-итерации судит о наличии каталога на ДИСКЕ,
21644
+ // а не по рантайм-полю прогона, которого у client-режима нет (TASWM-402).
21645
+ worktreesDir,
21595
21646
  // TASWM-472: реконсайлу от очереди нужен ровно исход `base_stale` (см. needsBaseRefreshNow).
21596
21647
  ...SWARM_MERGE_QUEUE ? { mergeQueue: mergeParts.queue } : {},
21597
21648
  narrate: narrator.narrate,
@@ -22332,6 +22383,7 @@ export {
22332
22383
  ABORT_TEXT,
22333
22384
  AWAITING_CI_REASON,
22334
22385
  BUDGET_STOP_REASON,
22386
+ CHANGES_FIX_COST_MARK,
22335
22387
  CHANGES_FRESH_WAKE_AFTER_MS,
22336
22388
  CHANGES_WAKE_COOLDOWN_MS,
22337
22389
  CHANGES_WAKE_ESCALATION_MARK,
@@ -22388,7 +22440,7 @@ export {
22388
22440
  VERIFY_SPAWN_LIMIT,
22389
22441
  WATCHDOG_PARK_REASON,
22390
22442
  abortReason,
22391
- buildChangesWakeNudge,
22443
+ buildChangesFixPrompt,
22392
22444
  buildCiReadyNudge,
22393
22445
  buildCiWakeNudge,
22394
22446
  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.37",
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": "3b1a04ef992f6bba42847d1dc29d22e39cadfc25",
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",