@taskless-app/swarm 0.6.52 → 0.6.53

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
@@ -3492,7 +3492,7 @@ var init_package = __esm({
3492
3492
  "package.json"() {
3493
3493
  package_default = {
3494
3494
  name: "@taskless-app/swarm",
3495
- version: "0.6.52",
3495
+ version: "0.6.53",
3496
3496
  type: "module",
3497
3497
  description: "Local control plane for a fleet of AI coding agents (drones), coordinating through Taskless. The overmind runs the swarm.",
3498
3498
  keywords: [
@@ -3530,7 +3530,7 @@ var init_package = __esm({
3530
3530
  swarm: 'NODE_OPTIONS="${NODE_OPTIONS:-} --conditions=development" tsx src/cli.ts',
3531
3531
  build: "tsup",
3532
3532
  start: "node dist/overmind.js",
3533
- prepublishOnly: "pnpm run build",
3533
+ prepublishOnly: "node ../../scripts/sync-drone-skills.mjs --check && pnpm run build",
3534
3534
  test: "vitest run && SWARM_TEST_BACKEND=client vitest run src/overmind.test.ts src/overmind.storm.test.ts src/db.storm.test.ts",
3535
3535
  "test:client": "SWARM_TEST_BACKEND=client vitest run src/overmind.test.ts src/overmind.storm.test.ts src/db.storm.test.ts",
3536
3536
  "test:watch": "vitest",
@@ -3543,7 +3543,7 @@ var init_package = __esm({
3543
3543
  execa: "^10.0.0",
3544
3544
  zod: "3.25.76"
3545
3545
  },
3546
- gitHead: "f77e0473fd2f80e4418ceadd1b29b9a70241fc04"
3546
+ gitHead: "f37d4b58b165539b1cc2585090d500a1dca39dad"
3547
3547
  };
3548
3548
  }
3549
3549
  });
package/dist/overmind.js CHANGED
@@ -12489,7 +12489,7 @@ function parkReasonUnretriable(reason) {
12489
12489
  // package.json
12490
12490
  var package_default = {
12491
12491
  name: "@taskless-app/swarm",
12492
- version: "0.6.52",
12492
+ version: "0.6.53",
12493
12493
  type: "module",
12494
12494
  description: "Local control plane for a fleet of AI coding agents (drones), coordinating through Taskless. The overmind runs the swarm.",
12495
12495
  keywords: [
@@ -12527,7 +12527,7 @@ var package_default = {
12527
12527
  swarm: 'NODE_OPTIONS="${NODE_OPTIONS:-} --conditions=development" tsx src/cli.ts',
12528
12528
  build: "tsup",
12529
12529
  start: "node dist/overmind.js",
12530
- prepublishOnly: "pnpm run build",
12530
+ prepublishOnly: "node ../../scripts/sync-drone-skills.mjs --check && pnpm run build",
12531
12531
  test: "vitest run && SWARM_TEST_BACKEND=client vitest run src/overmind.test.ts src/overmind.storm.test.ts src/db.storm.test.ts",
12532
12532
  "test:client": "SWARM_TEST_BACKEND=client vitest run src/overmind.test.ts src/overmind.storm.test.ts src/db.storm.test.ts",
12533
12533
  "test:watch": "vitest",
@@ -12540,7 +12540,7 @@ var package_default = {
12540
12540
  execa: "^10.0.0",
12541
12541
  zod: "3.25.76"
12542
12542
  },
12543
- gitHead: "f77e0473fd2f80e4418ceadd1b29b9a70241fc04"
12543
+ gitHead: "f37d4b58b165539b1cc2585090d500a1dca39dad"
12544
12544
  };
12545
12545
 
12546
12546
  // src/version.ts
@@ -19231,8 +19231,8 @@ ${task.description}` : `\u0417\u0430\u0434\u0430\u0447\u0430 ${run.task_slug} (\
19231
19231
  "0. \u041F\u0435\u0440\u0435\u0437\u0432\u043E\u043D\u0438 read_task() \u2014 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440 \u043C\u043E\u0433 \u0434\u043E\u043F\u0438\u0441\u0430\u0442\u044C \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u0435 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u043E\u043C \u0438\u043B\u0438 \u0432 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0443\u0436\u0435 \u041F\u041E\u0421\u041B\u0415 \u0442\u0432\u043E\u0435\u0433\u043E \u0441\u0442\u0430\u0440\u0442\u0430 (\u0441\u0442\u0430\u0440\u0442\u043E\u0432\u044B\u0439 \u043F\u0440\u043E\u043C\u043F\u0442 \u044D\u0442\u043E\u0433\u043E \u043D\u0435 \u0432\u0438\u0434\u0438\u0442, \u043E\u043D \u0441\u043D\u044F\u0442 \u043E\u0434\u0438\u043D \u0440\u0430\u0437 \u043F\u0440\u0438 \u0441\u043F\u0430\u0432\u043D\u0435). \u0421\u0432\u0435\u0440\u044C\u0441\u044F \u0441 \u0442\u0435\u043C, \u0447\u0442\u043E \u0432\u0435\u0440\u043D\u0443\u043B read_task, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0441\u0434\u0430\u0432\u0430\u0442\u044C.",
19232
19232
  verifyMode === "ci" ? "1. CI-\u0440\u0435\u0436\u0438\u043C (SWARM_VERIFY=ci): \u0433\u043E\u043D\u044F\u0439 \u0442\u043E\u043B\u044C\u043A\u043E \u0431\u044B\u0441\u0442\u0440\u0443\u044E \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u0443\u044E \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443 \u0442\u0438\u043F\u043E\u0432 \u0442\u043E\u0433\u043E, \u0447\u0442\u043E \u0442\u0440\u043E\u0433\u0430\u043B (\u0434\u0451\u0448\u0435\u0432\u043E, \u043B\u043E\u0432\u0438\u0442 \u0442\u0443\u043F\u044B\u0435 \u043E\u0448\u0438\u0431\u043A\u0438 \u0434\u043E \u0442\u0440\u0430\u0442\u044B CI-\u043F\u0440\u043E\u0433\u043E\u043D\u0430; \u0447\u0435\u043C \u043E\u043D\u0430 \u0434\u0435\u043B\u0430\u0435\u0442\u0441\u044F \u0432 \u044D\u0442\u043E\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u0435 \u2014 \u0432 \u0435\u0433\u043E \u0441\u043A\u0438\u043B\u043B\u0430\u0445/README) \u2014 \u043A\u0440\u0430\u0441\u043D\u043E\u0435 \u0447\u0438\u043D\u0438. \u0422\u044F\u0436\u0451\u043B\u0443\u044E \u0432\u0435\u0440\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044E (\u043F\u043E\u043B\u043D\u044B\u0439 \u0442\u0435\u0441\u0442-\u0441\u044C\u044E\u0442, e2e, \u0441\u0431\u043E\u0440\u043A\u0443 \u043E\u0431\u0440\u0430\u0437\u043E\u0432) \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u041D\u0415 \u0433\u043E\u043D\u044F\u0439, CI \u043F\u0440\u043E\u0433\u043E\u043D\u0438\u0442 \u0435\u0451 \u0441\u0430\u043C \u043F\u043E\u0441\u043B\u0435 push; \u043F\u043E\u043B\u0430\u0433\u0430\u0439\u0441\u044F \u043D\u0430 \u043D\u0435\u0451, \u0430 \u043D\u0435 \u0434\u043E\u0434\u0443\u043C\u044B\u0432\u0430\u0439 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442." : "1. \u0417\u0435\u043B\u0451\u043D\u044B\u0439 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0433\u043E\u043D \u043F\u0440\u043E\u0432\u0435\u0440\u043E\u043A \u0442\u043E\u0433\u043E, \u0447\u0442\u043E \u0442\u044B \u0442\u0440\u043E\u0433\u0430\u043B: \u0442\u0438\u043F\u044B + \u0442\u0435\u0441\u0442\u044B (\u043A\u0430\u043A\u0438\u043C\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0430\u043C\u0438 \u2014 \u0432 \u0441\u043A\u0438\u043B\u043B\u0430\u0445/README \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F, \u0447\u0442\u043E \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u0437\u0435\u043B\u0451\u043D\u044B\u043C \u2014 swarm-drone:swarm-verify-green). \u041A\u0440\u0430\u0441\u043D\u043E\u0435 \u2014 \u041D\u0415 \u0441\u0434\u0430\u0432\u0430\u0439, \u0447\u0438\u043D\u0438.",
19233
19233
  "1b. \u0417\u0415\u041B\u0401\u041D\u042B\u0419 \u2260 \u041F\u0420\u041E\u0412\u0415\u0420\u0415\u041D\u041E (TASWM-232). \u0421\u0431\u043E\u0440\u043E\u0447\u043D\u044B\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u044B \u0441 \u043A\u0435\u0448\u0435\u043C \u043E\u0442\u0434\u0430\u044E\u0442 \u041F\u0420\u041E\u0428\u041B\u042B\u0419 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442, \u0435\u0441\u043B\u0438 \u0445\u0435\u0448 \u0432\u0445\u043E\u0434\u043E\u0432 \u043D\u0435 \u043F\u043E\u043C\u0435\u043D\u044F\u043B\u0441\u044F, \u0438 \u043F\u0438\u0448\u0443\u0442 \u044D\u0442\u043E \u0432 \u0432\u044B\u0432\u043E\u0434 (`cache hit`, `up-to-date`, \xABreplayed\xBB). \u0417\u0435\u043B\u0451\u043D\u043E\u0435 \u0438\u0437 \u043A\u0435\u0448\u0430 \u043F\u043E \u0442\u043E\u043C\u0443, \u0447\u0442\u043E \u0442\u044B \u041F\u0420\u0410\u0412\u0418\u041B, \u0437\u043D\u0430\u0447\u0438\u0442, \u0447\u0442\u043E \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0434\u0435-\u0444\u0430\u043A\u0442\u043E \u043D\u0435 \u0431\u044B\u043B\u043E: \u043F\u0435\u0440\u0435\u043F\u0440\u043E\u0433\u043E\u043D\u0438 \u043F\u0440\u0438\u043D\u0443\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E (\u0444\u043B\u0430\u0433 \u0432\u0438\u0434\u0430 `--force`/`--no-cache`) \u0438 \u0432 \u043E\u0442\u0447\u0451\u0442\u0435 \u043E \u0441\u0434\u0430\u0447\u0435 \u043F\u043E\u043A\u0430\u0436\u0438 \u0441\u0442\u0440\u043E\u043A\u0443, \u0433\u0434\u0435 \u0432\u0438\u0434\u043D\u043E \u0420\u0415\u0410\u041B\u042C\u041D\u042B\u0419 \u043F\u0440\u043E\u0433\u043E\u043D, \u0430 \u043D\u0435 \u043E\u0442\u044B\u0433\u0440\u0430\u043D\u043D\u044B\u0439.",
19234
- "2. `/code-review --fix` \u2014 \u043F\u0440\u043E\u0433\u043E\u043D\u0438 \u0440\u0435\u0432\u044C\u044E \u0441\u0432\u043E\u0435\u0433\u043E \u0434\u0438\u0444\u0444\u0430; \u043F\u0440\u0438\u043C\u0435\u043D\u0451\u043D\u043D\u044B\u0435 \u043F\u0440\u0430\u0432\u043A\u0438 \u043F\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0439 \u0438 \u043F\u0435\u0440\u0435\u0443\u0431\u0435\u0434\u0438\u0441\u044C, \u0447\u0442\u043E \u043D\u0435 \u0441\u043B\u043E\u043C\u0430\u043B \u0444\u0438\u0447\u0443.",
19235
- "3. `/verify` \u2014 \u0422\u041E\u041B\u042C\u041A\u041E \u0435\u0441\u043B\u0438 \u043C\u0435\u043D\u044F\u043B \u0432\u0438\u0434\u0438\u043C\u044B\u0439 UI/\u0432\u0438\u0437\u0443\u0430\u043B: \u043F\u0440\u043E\u0433\u043E\u043D\u0438 \u0444\u0438\u0447\u0443 \u043D\u0430 \u0436\u0438\u0432\u043E\u043C \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 (\u043A\u0430\u043A \u0435\u0433\u043E \u043F\u043E\u0434\u043D\u044F\u0442\u044C \u2014 \u0432 \u0441\u043A\u0438\u043B\u043B\u0430\u0445 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F) \u0438 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435, \u043D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0442\u043E \u043A\u043E\u043C\u043F\u0438\u043B\u0438\u0440\u0443\u0435\u0442\u0441\u044F.",
19234
+ "2. `/code-review --fix` \u2014 \u043F\u0440\u043E\u0433\u043E\u043D\u0438 \u0440\u0435\u0432\u044C\u044E \u0441\u0432\u043E\u0435\u0433\u043E \u0434\u0438\u0444\u0444\u0430, \u043A\u043B\u0430\u0441\u0441\u044B \u0434\u0435\u0444\u0435\u043A\u0442\u043E\u0432 \u2014 \u0432 skill `swarm-drone:taskless-review`; \u043F\u0440\u0438\u043C\u0435\u043D\u0451\u043D\u043D\u044B\u0435 \u043F\u0440\u0430\u0432\u043A\u0438 \u043F\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0439 \u0438 \u043F\u0435\u0440\u0435\u0443\u0431\u0435\u0434\u0438\u0441\u044C, \u0447\u0442\u043E \u043D\u0435 \u0441\u043B\u043E\u043C\u0430\u043B \u0444\u0438\u0447\u0443.",
19235
+ "3. \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u043E\u043C \u043F\u043E skill `swarm-drone:taskless-check` \u2014 \u0422\u041E\u041B\u042C\u041A\u041E \u0435\u0441\u043B\u0438 \u043C\u0435\u043D\u044F\u043B \u0432\u0438\u0434\u0438\u043C\u044B\u0439 UI/\u0432\u0438\u0437\u0443\u0430\u043B: \u043F\u0440\u043E\u0433\u043E\u043D\u0438 \u0444\u0438\u0447\u0443 \u043D\u0430 \u0436\u0438\u0432\u043E\u043C \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 (\u043A\u0430\u043A \u0435\u0433\u043E \u043F\u043E\u0434\u043D\u044F\u0442\u044C \u2014 \u0432 \u0441\u043A\u0438\u043B\u043B\u0430\u0445 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F) \u0438 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435, \u043D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0442\u043E \u043A\u043E\u043C\u043F\u0438\u043B\u0438\u0440\u0443\u0435\u0442\u0441\u044F.",
19236
19236
  `4. \u0421\u043A\u0440\u0438\u043D\u044B mobile+desktop \u2014 \u0422\u041E\u041B\u042C\u041A\u041E \u0435\u0441\u043B\u0438 \u043C\u0435\u043D\u044F\u043B \u0432\u0438\u0434\u0438\u043C\u044B\u0439 UI/\u0432\u0438\u0437\u0443\u0430\u043B, \u041E\u0414\u041D\u041E\u0419 \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u0439: \`swarm shot <url> <out-prefix>\` (headless Chromium \u0441\u0430\u043C \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043E\u0431\u0430 \u0432\u044C\u044E\u043F\u043E\u0440\u0442\u0430, \u0441\u043D\u0438\u043C\u0430\u0435\u0442 \u0438 \u0432\u044B\u0445\u043E\u0434\u0438\u0442 \u2014 \u043D\u0435 \u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C). \u041F\u043E\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C \u2014 \u043E\u0431\u0430 \u0444\u0430\u0439\u043B\u0430 \u0418\u0414\u0423\u0422 \u0412 \u0417\u0410\u0414\u0410\u0427\u0423: \u043F\u0435\u0440\u0435\u0434\u0430\u0439 \u0438\u0445 \u043F\u0443\u0442\u0438 \u0432 \`done(pr_url, summary, screenshots: ["\u2026-desktop.png", "\u2026-mobile.png"])\`, \u0434\u0435\u043C\u043E\u043D \u043F\u0440\u0438\u043B\u043E\u0436\u0438\u0442 \u0438\u0445 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438 \u043A \u0442\u0432\u043E\u0435\u043C\u0443 \u043E\u0442\u0447\u0451\u0442\u0443 (TASWM-294). \u0427\u0435\u043B\u043E\u0432\u0435\u043A \u0441\u043C\u043E\u0442\u0440\u0438\u0442 \u0442\u0440\u0435\u043A\u0435\u0440, \u0430 \u043D\u0435 \u0433\u0438\u0442\u0445\u0430\u0431: \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u0435\u0437 \u0441\u043A\u0440\u0438\u043D\u043E\u0432 = \u043D\u0435\u0434\u043E\u043A\u0430\u0437\u0430\u043D\u043D\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430. \u0412 PR \u2014 \u0414\u041E\u041F\u041E\u041B\u041D\u0418\u0422\u0415\u041B\u042C\u041D\u041E, \u043F\u043E \u0436\u0435\u043B\u0430\u043D\u0438\u044E; \u0432\u043C\u0435\u0441\u0442\u043E \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u043D\u0435\u0442. \u23F1 \u0425\u0430\u0440\u0434-\u043B\u0438\u043C\u0438\u0442 \u043D\u0430 \u0432\u0435\u0441\u044C \u0448\u0430\u0433 \u0441\u043A\u0440\u0438\u043D\u043E\u0432 \u2014 5 \u043C\u0438\u043D\u0443\u0442. \u041D\u0415 \u0433\u043E\u043D\u044F\u0439 Playwright/\u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0439 Chrome \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u043F\u043E \u0448\u0430\u0433\u0430\u043C (\u043E\u0442\u043A\u0440\u044B\u043B\u2192\u043F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u043B\u2192\u043A\u043B\u0438\u043A\u043D\u0443\u043B\u2192\u043F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u043B\u2026) \u2014 \u0442\u0430\u043A \u0434\u0440\u043E\u043D \u0414\u0412\u0410\u0416\u0414\u042B \u0437\u0430\u043B\u0438\u043F\u0430\u043B \u043D\u0430 \u044D\u0442\u043E\u043C (TASWM-30, >30 \u043C\u0438\u043D stall \u0431\u0435\u0437 \u0435\u0434\u0438\u043D\u043E\u0433\u043E \u043A\u043E\u043C\u043C\u0438\u0442\u0430 \u0434\u0430\u043B\u044C\u0448\u0435) \u0432\u043C\u0435\u0441\u0442\u043E \u0442\u043E\u0433\u043E \u0447\u0442\u043E\u0431\u044B \u0441\u0434\u0430\u0442\u044C \u0433\u043E\u0442\u043E\u0432\u0443\u044E \u0440\u0430\u0431\u043E\u0442\u0443. \u041D\u0435 \u0443\u043B\u043E\u0436\u0438\u043B\u0441\u044F \u0432 \u043B\u0438\u043C\u0438\u0442 \u0438\u043B\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u043D\u0435 \u0438\u0434\u0451\u0442 \u2014 \u043F\u0440\u0438\u043B\u043E\u0436\u0438 \u0447\u0442\u043E \u0443\u0436\u0435 \u0441\u043D\u044F\u043B, \u0438\u043B\u0438 \u043F\u0440\u044F\u043C\u043E \u043D\u0430\u043F\u0438\u0448\u0438 \u0432 PR/\u0437\u0430\u0434\u0430\u0447\u0435 \xAB\u0441\u043A\u0440\u0438\u043D\u044B \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E\xBB \u0438 \u0421\u0420\u0410\u0417\u0423 \u0432\u044B\u0437\u043E\u0432\u0438 done(pr_url) \u2014 \u043D\u0435 \u043F\u0435\u0440\u0435\u0438\u0433\u0440\u044B\u0432\u0430\u0439 \u043F\u043E\u043F\u044B\u0442\u043A\u0438 \u043F\u043E \u043A\u0440\u0443\u0433\u0443.`,
19237
19237
  "4a. \u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u0417\u0410 \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0431\u0435\u0437 \u0433\u043E\u0442\u043E\u0432\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u0430\u0451\u0442 \u044D\u043A\u0440\u0430\u043D \u043B\u043E\u0433\u0438\u043D\u0430, \u0430 \u043D\u0435 \u0446\u0435\u043B\u0435\u0432\u043E\u0439 \u044D\u043A\u0440\u0430\u043D \u2014 \u0441\u043D\u0438\u043C\u0430\u0442\u044C \u0435\u0451 \u043D\u0443\u0436\u043D\u043E \u0441 `--storage-state <\u0444\u0430\u0439\u043B>` (\u043A\u0430\u043A \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u0442\u0430\u043A\u043E\u0439 \u0444\u0430\u0439\u043B \u0432 \u044D\u0442\u043E\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u0435 \u2014 \u0432 \u0435\u0433\u043E \u0441\u043A\u0438\u043B\u043B\u0430\u0445). \u041F\u043E\u0440\u044F\u0434\u043E\u043A \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0432\u0430\u0436\u0435\u043D: `--storage-state` \u0411\u0415\u0417 \u043F\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0435\u0433\u043E `<out-prefix>` \u043C\u043E\u043B\u0447\u0430 \u0441\u044A\u0435\u0434\u0430\u0435\u0442 \u0435\u0433\u043E \u043C\u0435\u0441\u0442\u043E, \u0438 \u0444\u043B\u0430\u0433 \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u0441\u044F (\u0441\u043C. shotCli.ts parseShotArgs) \u2014 \u0435\u0441\u043B\u0438 \u043D\u0430 \u0441\u043D\u0438\u043C\u043A\u0435 \u044D\u043A\u0440\u0430\u043D \u043B\u043E\u0433\u0438\u043D\u0430 \u0432\u043C\u0435\u0441\u0442\u043E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F, \u043F\u0440\u043E\u0432\u0435\u0440\u044C \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u044D\u0442\u043E.",
19238
19238
  "4b. \u0421\u041D\u0418\u041C\u0410\u0419 \u041F\u0420\u041E\u0414\u0423\u041A\u0422, \u0410 \u041D\u0415 \u041F\u0420\u0415\u0412\u042C\u042E-\u0421\u0422\u0420\u0410\u041D\u0418\u0426\u0423 (TASWM-404). \u0414\u0435\u043C\u043E-\u0440\u043E\u0443\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 (`/dev/*`, \u043F\u0435\u0441\u043E\u0447\u043D\u0438\u0446\u0430, \u0441\u0442\u043E\u0440\u0438 \u0432 \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u043E\u043C \u0444\u0440\u0435\u0439\u043C\u0435) \u2014 \u041D\u0415 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u043E\u0439 \u0432\u0451\u0440\u0441\u0442\u043A\u0438: \u0443 \u0442\u0430\u043A\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u0441\u0432\u043E\u044F \u043E\u0431\u043E\u043B\u043E\u0447\u043A\u0430, \u0435\u0451 \u043C\u0435\u043D\u044E \u043E\u0431\u044B\u0447\u043D\u043E \u043D\u0435 \u0441\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043D\u0430 \u0443\u0437\u043A\u043E\u043C \u044D\u043A\u0440\u0430\u043D\u0435, \u0438 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u043C\u0443 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u043F\u043E\u043B\u043E\u0441\u0430 \u0432 \u043F\u0430\u0440\u0443 \u0441\u043E\u0442\u0435\u043D \u043F\u0438\u043A\u0441\u0435\u043B\u0435\u0439 \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0439 \u0448\u0438\u0440\u0438\u043D\u044B. \u041F\u043E \u0442\u0430\u043A\u043E\u043C\u0443 \u0441\u043D\u0438\u043C\u043A\u0443 \u043D\u0435 \u0432\u0438\u0434\u043D\u043E \u043D\u0438 \u0448\u0438\u0440\u0438\u043D\u044B \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432, \u043D\u0438 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0448\u0430\u043F\u043A\u0438, \u043D\u0438 \u043D\u0430\u043F\u043E\u043B\u0437\u0430\u043D\u0438\u044F \u043B\u0438\u043F\u043A\u0438\u0445 \u043F\u043E\u0434\u043F\u0438\u0441\u0435\u0439 \u2014 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043F\u0440\u043E\u0445\u043E\u0434\u0438\u0442 \u0412\u0421\u0415\u0413\u0414\u0410 \u0438 \u043D\u0435 \u043B\u043E\u0432\u0438\u0442 \u043D\u0438\u0447\u0435\u0433\u043E (\u0442\u0430\u043A \u0441\u0434\u0430\u043B\u0438 \u0441\u043B\u043E\u043C\u0430\u043D\u043D\u0443\u044E \u043C\u043E\u0431\u0438\u043B\u0443 \u0432 TASWM-403, \u0441\u043A\u0440\u0438\u043D \u043F\u0440\u0438 \u044D\u0442\u043E\u043C \u0431\u044B\u043B \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D). \u0421\u043D\u0438\u043C\u0430\u0439 \u0420\u0415\u0410\u041B\u042C\u041D\u042B\u0419 \u0440\u043E\u0443\u0442 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0434 \u0436\u0438\u0432\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0435\u0439; \u043A\u0430\u043A \u044D\u0442\u043E \u0441\u0434\u0435\u043B\u0430\u0442\u044C \u043E\u0434\u043D\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u0439 \u0432 \u044D\u0442\u043E\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u0435 \u2014 \u0432 \u0435\u0433\u043E \u0441\u043A\u0438\u043B\u043B\u0430\u0445. \u041F\u0440\u0435\u0432\u044C\u044E \u0437\u0430\u043A\u043E\u043D\u043D\u043E \u0440\u043E\u0432\u043D\u043E \u0442\u043E\u0433\u0434\u0430, \u043A\u043E\u0433\u0434\u0430 \u043F\u0440\u0430\u0432\u0438\u0448\u044C \u0441\u0430\u043C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442 \u0432\u043D\u0435 \u043E\u0431\u043E\u043B\u043E\u0447\u043A\u0438 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F.",
@@ -19247,7 +19247,7 @@ ${task.description}` : `\u0417\u0430\u0434\u0430\u0447\u0430 ${run.task_slug} (\
19247
19247
  // TASWM-466: рядом с правилом о репозитории — у них один смысл (знание, добытое
19248
19248
  // прогоном, переживает прогон) и одна цена ошибки: лишняя заметка дороже отсутствующей.
19249
19249
  ...zoneMemoryBlock ? [zoneMemoryBlock] : [],
19250
- "\u0421\u043A\u0438\u043B\u043B\u044B \u043F\u0440\u0438\u0445\u043E\u0434\u044F\u0442 \u043A \u0442\u0435\u0431\u0435 \u0414\u0412\u0423\u041C\u042F \u043D\u0430\u0431\u043E\u0440\u0430\u043C\u0438, \u0438 \u043E\u0431\u0430 \u0443\u0436\u0435 \u043F\u043E\u0434\u0445\u0432\u0430\u0447\u0435\u043D\u044B (\u0441\u043F\u0430\u0432\u043D \u0438\u0437\u043E\u043B\u0438\u0440\u043E\u0432\u0430\u043D \u043E\u0442 \u044E\u0437\u0435\u0440\u0441\u043A\u043E\u0433\u043E ~/.claude, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u041B\u0418\u0427\u041D\u042B\u0415 \u0441\u043A\u0438\u043B\u043B\u044B \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430 \u0442\u0435\u0431\u0435 \u043D\u0435 \u0432\u0438\u0434\u043D\u044B). \u2460 \u0420\u043E\u0439\u043D\u044B\u0435 `swarm-drone:*` \u0435\u0434\u0443\u0442 \u0441 \u0420\u041E\u0415\u041C \u0432 \u043B\u044E\u0431\u043E\u0439 \u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0434\u0438\u0441\u0446\u0438\u043F\u043B\u0438\u043D\u0430, \u0432\u0435\u0440\u043D\u0430\u044F \u0432\u0435\u0437\u0434\u0435: swarm-save-often (\u043D\u0435\u0437\u0430\u043F\u0443\u0448\u0435\u043D\u043D\u043E\u0435 \u0443\u043C\u0438\u0440\u0430\u0435\u0442 \u0441 \u0434\u0440\u043E\u043D\u043E\u043C), swarm-merge-main (\u0431\u0430\u0437\u043E\u0432\u0443\u044E \u0432\u0435\u0442\u043A\u0443 \u0432\u043B\u0438\u0432\u0430\u0442\u044C, \u0430 \u043D\u0435 \u0440\u0435\u0431\u0435\u0439\u0437\u0438\u0442\u044C \u0437\u0430\u043F\u0443\u0448\u0435\u043D\u043D\u0443\u044E), swarm-await-process (\u0436\u0434\u0430\u0442\u044C \u0443\u0441\u043B\u043E\u0432\u0438\u0435, \u043D\u0435 sleep), swarm-verify-green (\u0447\u0442\u043E \u0441\u0447\u0438\u0442\u0430\u0442\u044C \u0437\u0435\u043B\u0451\u043D\u044B\u043C), systematic-debugging (\u043F\u0435\u0440\u0432\u043E\u043F\u0440\u0438\u0447\u0438\u043D\u0430 \u0434\u043E \u0444\u0438\u043A\u0441\u0430). \u2461 \u0421\u043A\u0438\u043B\u043B\u044B \u0420\u0415\u041F\u041E\u0417\u0418\u0422\u041E\u0420\u0418\u042F (.claude/skills, \u0441\u043E\u0441\u0442\u0430\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u043F\u0440\u043E\u0435\u043A\u0442\u0430) \u2014 \u0437\u043D\u0430\u043D\u0438\u044F \u043E\u0431 \u044D\u0442\u043E\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u0435: \u043A\u0430\u043A \u043F\u043E\u0434\u043D\u044F\u0442\u044C \u0441\u0442\u0435\u043A, \u043A\u0430\u043A \u0433\u043E\u043D\u044F\u0442\u044C \u0442\u0435\u0441\u0442\u044B \u0438 \u0447\u0442\u043E \u0437\u0434\u0435\u0441\u044C \u0437\u0435\u043B\u0451\u043D\u043E\u0435, UI-\u043F\u0440\u0430\u0432\u0438\u043B\u0430. \u041F\u043E\u043B\u044C\u0437\u0443\u0439\u0441\u044F \u043E\u0431\u043E\u0438\u043C\u0438, \u043D\u0435 \u043F\u0435\u0440\u0435\u0438\u0437\u043E\u0431\u0440\u0435\u0442\u0430\u0439; \u043D\u0435\u0442 \u043D\u0443\u0436\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u043D\u0438\u044F \u043E \u043F\u0440\u043E\u0435\u043A\u0442\u0435 \u2014 \u044D\u0442\u043E \u043F\u0440\u043E\u0431\u0435\u043B \u0435\u0433\u043E \u0441\u043A\u0438\u043B\u043B\u043E\u0432, \u0441\u043A\u0430\u0436\u0438 note(), \u0430 \u043D\u0435 \u0432\u044B\u0434\u0443\u043C\u044B\u0432\u0430\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B."
19250
+ "\u0421\u043A\u0438\u043B\u043B\u044B \u043F\u0440\u0438\u0445\u043E\u0434\u044F\u0442 \u043A \u0442\u0435\u0431\u0435 \u0414\u0412\u0423\u041C\u042F \u043D\u0430\u0431\u043E\u0440\u0430\u043C\u0438, \u0438 \u043E\u0431\u0430 \u0443\u0436\u0435 \u043F\u043E\u0434\u0445\u0432\u0430\u0447\u0435\u043D\u044B (\u0441\u043F\u0430\u0432\u043D \u0438\u0437\u043E\u043B\u0438\u0440\u043E\u0432\u0430\u043D \u043E\u0442 \u044E\u0437\u0435\u0440\u0441\u043A\u043E\u0433\u043E ~/.claude, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u041B\u0418\u0427\u041D\u042B\u0415 \u0441\u043A\u0438\u043B\u043B\u044B \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430 \u0442\u0435\u0431\u0435 \u043D\u0435 \u0432\u0438\u0434\u043D\u044B). \u2460 \u0420\u043E\u0439\u043D\u044B\u0435 `swarm-drone:*` \u0435\u0434\u0443\u0442 \u0441 \u0420\u041E\u0415\u041C \u0432 \u043B\u044E\u0431\u043E\u0439 \u043F\u0440\u043E\u0435\u043A\u0442 \u2014 \u0434\u0438\u0441\u0446\u0438\u043F\u043B\u0438\u043D\u0430, \u0432\u0435\u0440\u043D\u0430\u044F \u0432\u0435\u0437\u0434\u0435: swarm-save-often (\u043D\u0435\u0437\u0430\u043F\u0443\u0448\u0435\u043D\u043D\u043E\u0435 \u0443\u043C\u0438\u0440\u0430\u0435\u0442 \u0441 \u0434\u0440\u043E\u043D\u043E\u043C), swarm-merge-main (\u0431\u0430\u0437\u043E\u0432\u0443\u044E \u0432\u0435\u0442\u043A\u0443 \u0432\u043B\u0438\u0432\u0430\u0442\u044C, \u0430 \u043D\u0435 \u0440\u0435\u0431\u0435\u0439\u0437\u0438\u0442\u044C \u0437\u0430\u043F\u0443\u0448\u0435\u043D\u043D\u0443\u044E), swarm-await-process (\u0436\u0434\u0430\u0442\u044C \u0443\u0441\u043B\u043E\u0432\u0438\u0435, \u043D\u0435 sleep), swarm-verify-green (\u0447\u0442\u043E \u0441\u0447\u0438\u0442\u0430\u0442\u044C \u0437\u0435\u043B\u0451\u043D\u044B\u043C, \u0442\u044F\u0436\u0451\u043B\u044B\u0439 \u043F\u0440\u043E\u0433\u043E\u043D \u2014 \u0432 \u0444\u0430\u0439\u043B), \u0438 skills \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0430 \u0438\u0437 \u043D\u0430\u0431\u043E\u0440\u0430 Taskless, \u0442\u0435 \u0436\u0435, \u0447\u0442\u043E \u0443 \u043B\u044E\u0434\u0435\u0439 \u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u0435: taskless-build (\u043A\u0430\u043A \u0434\u0435\u043B\u0430\u0442\u044C: \u043A\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u2014 \u043F\u0435\u0440\u0432\u044B\u0435 \u0442\u0435\u0441\u0442\u044B, \u043A\u0440\u0430\u0441\u043D\u044B\u0439 \u0442\u0435\u0441\u0442 \u0434\u043E \u043A\u043E\u0434\u0430), taskless-check (\u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u043E\u043C \u043F\u0435\u0440\u0435\u0434 \u0441\u0434\u0430\u0447\u0435\u0439), taskless-review (\u043A\u043B\u0430\u0441\u0441\u044B \u0434\u0435\u0444\u0435\u043A\u0442\u043E\u0432), taskless-debug (\u043F\u0435\u0440\u0432\u043E\u043F\u0440\u0438\u0447\u0438\u043D\u0430 \u0434\u043E \u0444\u0438\u043A\u0441\u0430). \u2461 \u0421\u043A\u0438\u043B\u043B\u044B \u0420\u0415\u041F\u041E\u0417\u0418\u0422\u041E\u0420\u0418\u042F (.claude/skills, \u0441\u043E\u0441\u0442\u0430\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u043F\u0440\u043E\u0435\u043A\u0442\u0430) \u2014 \u0437\u043D\u0430\u043D\u0438\u044F \u043E\u0431 \u044D\u0442\u043E\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u0435: \u043A\u0430\u043A \u043F\u043E\u0434\u043D\u044F\u0442\u044C \u0441\u0442\u0435\u043A, \u043A\u0430\u043A \u0433\u043E\u043D\u044F\u0442\u044C \u0442\u0435\u0441\u0442\u044B \u0438 \u0447\u0442\u043E \u0437\u0434\u0435\u0441\u044C \u0437\u0435\u043B\u0451\u043D\u043E\u0435, UI-\u043F\u0440\u0430\u0432\u0438\u043B\u0430. \u041F\u043E\u043B\u044C\u0437\u0443\u0439\u0441\u044F \u043E\u0431\u043E\u0438\u043C\u0438, \u043D\u0435 \u043F\u0435\u0440\u0435\u0438\u0437\u043E\u0431\u0440\u0435\u0442\u0430\u0439; \u043D\u0435\u0442 \u043D\u0443\u0436\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u043D\u0438\u044F \u043E \u043F\u0440\u043E\u0435\u043A\u0442\u0435 \u2014 \u044D\u0442\u043E \u043F\u0440\u043E\u0431\u0435\u043B \u0435\u0433\u043E \u0441\u043A\u0438\u043B\u043B\u043E\u0432, \u0441\u043A\u0430\u0436\u0438 note(), \u0430 \u043D\u0435 \u0432\u044B\u0434\u0443\u043C\u044B\u0432\u0430\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B."
19251
19251
  ];
19252
19252
  if (run.decision) {
19253
19253
  const d = run.decision;
@@ -19318,21 +19318,14 @@ function ciTrustLine(prUrl, verifyMode) {
19318
19318
  }
19319
19319
  return `\u041D\u0435 \u043F\u0435\u0440\u0435\u0433\u043E\u043D\u044F\u0439 \u0442\u0435\u0441\u0442-\u0441\u044C\u044E\u0442/typecheck \u0437\u0430\u043D\u043E\u0432\u043E \u2014 \u044D\u0442\u043E \u0443\u0436\u0435 \u0441\u0434\u0435\u043B\u0430\u043B CI \u043D\u0430 \u044D\u0442\u043E\u043C \u0436\u0435 \u043A\u043E\u043C\u043C\u0438\u0442\u0435 (\u0434\u0432\u043E\u0439\u043D\u043E\u0439 \u043F\u0440\u043E\u0433\u043E\u043D \u043D\u0430 \u043C\u0430\u0448\u0438\u043D\u0435 \u0432\u043B\u0430\u0434\u0435\u043B\u044C\u0446\u0430 \u043E\u0442\u043C\u0435\u043D\u0451\u043D, TASWM-249). \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0439 \u0435\u0433\u043E \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u0441\u0430\u043C: ${readChecks}. \u0414\u0430\u043B\u044C\u0448\u0435 \u0442\u0440\u0438 \u0440\u0430\u0437\u043D\u044B\u0445 \u0441\u043B\u0443\u0447\u0430\u044F: \u2460 \u0445\u043E\u0442\u044C \u043E\u0434\u0438\u043D \u0447\u0435\u043A \u0435\u0449\u0451 PENDING \u2014 \u0432\u0435\u0440\u0434\u0438\u043A\u0442 \u0432\u043E\u043E\u0431\u0449\u0435 \u043D\u0435 \u0432\u044B\u043D\u043E\u0441\u0438: \u043D\u0435 \u043F\u043E\u0441\u0442\u0438 REQUEST CHANGES, \u043D\u0435 \u0437\u043E\u0432\u0438 done(), \u043F\u0440\u043E\u0441\u0442\u043E \u0437\u0430\u0432\u0435\u0440\u0448\u0438 \u0441\u0435\u0441\u0441\u0438\u044E \u043A\u0430\u043A \u0435\u0441\u0442\u044C \u2014 \u0440\u043E\u0439 \u0441\u0430\u043C \u0437\u0430\u043C\u0435\u0442\u0438\u0442, \u0447\u0442\u043E \u0442\u044B \u0436\u0434\u0451\u0448\u044C CI, \u0438 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442 \u0434\u043E\u0434\u0435\u043B\u0430\u0442\u044C \u0440\u0435\u0432\u044C\u044E, \u043A\u043E\u0433\u0434\u0430 \u0432\u0441\u0435 \u0447\u0435\u043A\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u0441\u044F (\u044D\u0442\u043E \u0448\u0442\u0430\u0442\u043D\u044B\u0439 \u043F\u0443\u0442\u044C, \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430 \u0437\u0432\u0430\u0442\u044C \u043D\u0435 \u043D\u0443\u0436\u043D\u043E). \u2461 \u0432\u0441\u0435 \u0447\u0435\u043A\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u0438\u0441\u044C \u0438 \u0435\u0441\u0442\u044C FAIL \u2014 REQUEST CHANGES, \u043D\u0430\u0437\u043E\u0432\u0438 \u043F\u043E\u0438\u043C\u0451\u043D\u043D\u043E, \u0447\u0442\u043E \u0443\u043F\u0430\u043B\u043E. \u2462 \u043D\u0430 \u044D\u0442\u043E\u043C \u043A\u043E\u043C\u043C\u0438\u0442\u0435 \u0447\u0435\u043A\u043E\u0432 \u043D\u0435\u0442 \u0432\u043E\u0432\u0441\u0435 \u2014 \u0442\u043E\u0436\u0435 REQUEST CHANGES: \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u043D\u0435\u0447\u0435\u043C (\u0443 \u044D\u0442\u043E\u0433\u043E \u043F\u0440\u043E\u0435\u043A\u0442\u0430 verifyMode=ci, \u0442\u043E \u0435\u0441\u0442\u044C CI \u043E\u0431\u044F\u0437\u0430\u043D \u0431\u044B\u0442\u044C). ${dontTrustAuthor}`;
19320
19320
  }
19321
- var REVIEW_DEFECT_CLASSES = [
19322
- "\u041A\u043B\u0430\u0441\u0441\u044B \u0434\u0435\u0444\u0435\u043A\u0442\u043E\u0432 \u2014 \u043F\u0440\u043E\u0439\u0434\u0438 \u043F\u043E \u043A\u0430\u0436\u0434\u043E\u043C\u0443 \u0438 \u0434\u0430\u0439 \u043E\u0442\u0432\u0435\u0442 \u0432 \u0432\u0435\u0440\u0434\u0438\u043A\u0442\u0435; \xAB\u043D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u043C\u043E\xBB \u2014 \u0437\u0430\u043A\u043E\u043D\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442, \u043D\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u043D\u044B\u0439 \u0438 \u0441 \u043F\u0440\u0438\u0447\u0438\u043D\u043E\u0439 \u0432 \u043F\u043E\u043B\u0441\u0442\u0440\u043E\u043A\u0438 (\xAB\u0440\u0443\u0447\u0435\u043A \u043D\u0435 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043E\xBB, \xAB\u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0439 \u043D\u0435 \u0442\u0440\u043E\u043D\u0443\u0442\u043E\xBB). \xAB\u041D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u043C\u043E\xBB \u0431\u0435\u0437 \u043F\u0440\u0438\u0447\u0438\u043D\u044B \u043F\u043E \u0432\u0441\u0435\u043C \u043F\u0443\u043D\u043A\u0442\u0430\u043C \u043F\u043E\u0434\u0440\u044F\u0434 \u2014 \u043D\u0435 \u0440\u0435\u0432\u044C\u044E, \u0430 \u043E\u0442\u043F\u0438\u0441\u043A\u0430:",
19323
- "- [ ] \u041F\u0440\u0430\u0432\u0430 \u0430\u043A\u0442\u043E\u0440\u0430 \u0438 \u0432\u043E\u0440\u043A\u0441\u043F\u0435\u0439\u0441: \u043A\u0442\u043E \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438 \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u0437\u0432\u0430\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u0440\u0443\u0447\u043A\u0443 \u0438\u043B\u0438 \u043D\u0430\u0436\u0430\u0442\u044C \u043A\u043D\u043E\u043F\u043A\u0443 \u2014 \u0447\u0435\u043B\u043E\u0432\u0435\u043A, \u0434\u0440\u043E\u043D \u0440\u043E\u044F, \u0433\u043E\u0441\u0442\u044C, \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A \u0427\u0423\u0416\u041E\u0413\u041E \u0432\u043E\u0440\u043A\u0441\u043F\u0435\u0439\u0441\u0430? \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u0432\u043E\u0434\u0438\u043B\u0430 \u0440\u0430\u0434\u0438 \u0420\u0415\u0428\u0415\u041D\u0418\u042F \u0427\u0415\u041B\u041E\u0412\u0415\u041A\u0410 (\u043F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u044F, \u0430\u043F\u0440\u0443\u0432, \u043E\u043F\u043B\u0430\u0442\u0430, \u0440\u0430\u0441\u0441\u044B\u043B\u043A\u0430), \u043E\u0431\u044F\u0437\u0430\u043D\u043E \u043E\u0442\u0431\u0438\u0432\u0430\u0442\u044C \u0430\u0433\u0435\u043D\u0442\u0430 \u044F\u0432\u043D\u043E (denyAgentActor \u0438 \u0430\u043D\u0430\u043B\u043E\u0433\u0438), \u0430 \u043D\u0435 \u043F\u043E\u043B\u0430\u0433\u0430\u0442\u044C\u0441\u044F \u043D\u0430 \u0442\u043E, \u0447\u0442\u043E \u0443 \u043D\u0435\u0433\u043E \u0440\u043E\u043B\u044C \u043F\u043E\u0436\u0438\u0436\u0435 \u2014 \u0443 \u0434\u0440\u043E\u043D\u0430 \u043E\u043D\u0430 \u043E\u0431\u044B\u0447\u043D\u043E \u043A\u0430\u043A \u0443 \u0432\u043B\u0430\u0434\u0435\u043B\u044C\u0446\u0430. \u041B\u044E\u0431\u043E\u0439 id, \u043F\u0440\u0438\u0435\u0445\u0430\u0432\u0448\u0438\u0439 \u0432 \u0442\u0435\u043B\u0435 \u0437\u0430\u043F\u0440\u043E\u0441\u0430, \u043E\u0431\u044F\u0437\u0430\u043D \u0441\u0432\u0435\u0440\u044F\u0442\u044C\u0441\u044F \u0441 \u0432\u043E\u0440\u043A\u0441\u043F\u0435\u0439\u0441\u043E\u043C \u0437\u0432\u043E\u043D\u044F\u0449\u0435\u0433\u043E: \u0440\u043E\u0443\u0442 \u0431\u0435\u0437 \u0442\u0430\u043A\u043E\u0439 \u0441\u0432\u0435\u0440\u043A\u0438 \u2014 \u043A\u0440\u043E\u0441\u0441-\u0442\u0435\u043D\u0430\u043D\u0442\u043D\u0430\u044F \u0434\u044B\u0440\u0430, \u0438 \u0432 \u044D\u0442\u043E\u043C \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u0438 \u044D\u0442\u043E \u0441\u0430\u043C\u044B\u0439 \u0447\u0430\u0441\u0442\u044B\u0439 \u043A\u043B\u0430\u0441\u0441.",
19324
- "- [ ] \u041F\u043E\u043B\u043D\u043E\u0442\u0430 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432: PR \u0434\u043E\u0431\u0430\u0432\u0438\u043B \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u0432 enum/union/\u043D\u0430\u0431\u043E\u0440 \u0441\u0442\u0440\u043E\u043A \u2014 \u043D\u0430\u0439\u0434\u0438 \u0412\u0421\u0415 \u043C\u0435\u0441\u0442\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u044D\u0442\u0438 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u044F\u044E\u0442 (\u0431\u0435\u043B\u044B\u0435 \u0441\u043F\u0438\u0441\u043A\u0438, switch, \u043C\u0430\u043F\u043F\u0438\u043D\u0433\u0438, \u0443\u0441\u043B\u043E\u0432\u0438\u044F \u0432 UI), \u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u044C, \u0447\u0442\u043E \u043D\u043E\u0432\u044B\u0439 \u0442\u0430\u043C \u0435\u0441\u0442\u044C. typecheck \u044D\u0442\u043E \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u0441\u043F\u0438\u0441\u043E\u043A \u2014 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435, \u0430 \u043D\u0435 exhaustive-switch. \u042D\u0442\u043E \u041E\u0414\u0418\u041D grep \u043F\u043E \u0438\u043C\u0435\u043D\u0438 \u0442\u0438\u043F\u0430 \u0438\u043B\u0438 \u043F\u043E \u0441\u0430\u043C\u043E\u043C\u0443 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044E, \u0430 \u043D\u0435 \u0447\u0442\u0435\u043D\u0438\u0435 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F \xAB\u0434\u043B\u044F \u043F\u043E\u043D\u0438\u043C\u0430\u043D\u0438\u044F\xBB \u2014 \u043A\u043E\u043D\u0442\u0443\u0440 \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0438 \u0442\u0430\u043A\u043E\u0433\u043E \u043D\u0435 \u0437\u0430\u043F\u0440\u0435\u0449\u0430\u0435\u0442.",
19325
- "- [ ] \u0412\u0441\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0430: \u0443 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u043F\u043E\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u043E\u043B\u044C\u0448\u0435 \u0434\u0432\u0443\u0445 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0439 (\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E, \u043F\u0430\u0443\u0437\u0430, drain, \u043C\u043E\u043B\u0447\u0438\u0442, \u0434\u0430\u043D\u043D\u044B\u0445 \u0435\u0449\u0451 \u043D\u0435\u0442, \u0434\u043E\u0441\u0442\u0443\u043F \u0437\u0430\u043A\u0440\u044B\u0442). \u0420\u0430\u0437\u043E\u0431\u0440\u0430\u043D\u044B \u0412\u0421\u0415 \u0438\u043B\u0438 \u0442\u043E\u043B\u044C\u043A\u043E happy path \u0438 \u043E\u0434\u043D\u0430 \u043E\u0448\u0438\u0431\u043A\u0430? \u0427\u0430\u0441\u0442\u043E \u043F\u043E\u043B\u043D\u044B\u0439 \u043D\u0430\u0431\u043E\u0440 \u0443\u0436\u0435 \u043B\u0435\u0436\u0438\u0442 \u0440\u044F\u0434\u043E\u043C \u0432 \u044F\u0434\u0440\u0435 \u2014 \u043F\u043E\u0438\u0449\u0438 \u0435\u0433\u043E, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0441\u0447\u0438\u0442\u0430\u0442\u044C \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0435 \u043F\u043E\u043B\u043D\u044B\u043C.",
19326
- "- [ ] \u041E\u0448\u0438\u0431\u043A\u0430 \u0434\u043E\u0445\u043E\u0434\u0438\u0442 \u0434\u043E \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430: \u043E\u0442\u043A\u0430\u0437 \u0437\u0430\u043F\u0440\u043E\u0441\u0430, \u043F\u0440\u043E\u0432\u0430\u043B \u0432\u0430\u043B\u0438\u0434\u0430\u0446\u0438\u0438, \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442 \u2014 \u0432\u0438\u0434\u043D\u044B \u0432 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435, \u0430 \u043D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 console.warn/\u043B\u043E\u0433. \u041A\u043D\u043E\u043F\u043A\u0430, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043C\u043E\u043B\u0447\u0430 \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u0441\u0434\u0435\u043B\u0430\u043B\u0430, \u2014 \u0434\u0435\u0444\u0435\u043A\u0442, \u0434\u0430\u0436\u0435 \u0435\u0441\u043B\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043E\u0442\u0432\u0435\u0442\u0438\u043B \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E.",
19327
- "- [ ] \u0414\u0435\u0444\u043E\u043B\u0442 \u043F\u0440\u0438 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0434\u0430\u043D\u043D\u044B\u0445: \u043F\u043E\u043B\u044F \u043D\u0435\u0442, \u043E\u0442\u0432\u0435\u0442 \u043F\u0443\u0441\u0442\u043E\u0439, \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u044C \u043C\u043E\u043B\u0447\u0438\u0442 \u2014 \u043A\u0443\u0434\u0430 \u043F\u0430\u0434\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043D\u0438\u0435? \u0414\u043B\u044F \u0443\u0434\u0430\u043B\u044F\u044E\u0449\u0438\u0445, \u043F\u0443\u0431\u043B\u0438\u043A\u0443\u044E\u0449\u0438\u0445 \u0438 \u0441\u043F\u0438\u0441\u044B\u0432\u0430\u044E\u0449\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u0435\u0444\u043E\u043B\u0442 \u043E\u0431\u044F\u0437\u0430\u043D \u0431\u044B\u0442\u044C \u0432 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u0443\u044E \u0441\u0442\u043E\u0440\u043E\u043D\u0443 (\u043D\u0435 \u0434\u0435\u043B\u0430\u0442\u044C), \u0430 \xAB\u043D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445\xBB \u043D\u0435 \u0441\u043C\u0435\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044C\u0441\u044F \u043A\u0430\u043A \xAB\u0447\u0438\u0441\u0442\u043E, \u043C\u043E\u0436\u043D\u043E\xBB.",
19328
- "- [ ] \u0422\u0435\u0441\u0442\u044B PR \u0434\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0442 \u0437\u0430\u044F\u0432\u043B\u0435\u043D\u043D\u043E\u0435. \u0415\u0441\u043B\u0438 \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u0435 \u0423\u0416\u0415 \u043F\u043E\u0434\u043D\u044F\u0442\u043E (\u0432 worktree \u0435\u0441\u0442\u044C node_modules \u0438 \u043F\u0430\u043A\u0435\u0442\u044B \u0441\u043E\u0431\u0440\u0430\u043D\u044B): \u0441\u043D\u0438\u043C\u0438 \u0432 \u041A\u041E\u0414\u0415 \u0442\u0443 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443, \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u043D\u043E\u0432\u044B\u0439 \u0442\u0435\u0441\u0442 \u044F\u043A\u043E\u0431\u044B \u0441\u0442\u043E\u0440\u043E\u0436\u0438\u0442 (\u043E\u0434\u043D\u0443 \u0441\u0442\u0440\u043E\u043A\u0443 \u2014 \u0433\u0435\u0439\u0442, \u0443\u0441\u043B\u043E\u0432\u0438\u0435, \u0432\u0430\u043B\u0438\u0434\u0430\u0446\u0438\u044E), \u043F\u0440\u043E\u0433\u043E\u043D\u0438 \u041E\u0414\u0418\u041D \u044D\u0442\u043E\u0442 \u0442\u0435\u0441\u0442 (\u043D\u0435 \u0432\u0435\u0441\u044C \u0441\u044C\u044E\u0442), \u0432\u0435\u0440\u043D\u0438 \u0444\u0430\u0439\u043B \u043A\u0430\u043A \u0431\u044B\u043B\u043E. \u0422\u0435\u0441\u0442 \u043E\u0431\u044F\u0437\u0430\u043D \u043F\u043E\u043A\u0440\u0430\u0441\u043D\u0435\u0442\u044C; \u043E\u0441\u0442\u0430\u043B\u0441\u044F \u0437\u0435\u043B\u0451\u043D\u044B\u043C \u2014 \u043D\u0430\u0445\u043E\u0434\u043A\u0430: \u043E\u043D \u043D\u0435 \u0441\u0442\u043E\u0440\u043E\u0436\u0438\u0442 \u043D\u0438\u0447\u0435\u0433\u043E.",
19329
- " \u041E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u0435 \u041D\u0415 \u043F\u043E\u0434\u043D\u044F\u0442\u043E \u2014 \u0442\u0430\u043A \u0438 \u0431\u0443\u0434\u0435\u0442: \u0442\u0435\u0431\u0435 \u043F\u043E\u0434\u043D\u044F\u043B\u0438 \u0447\u0438\u0441\u0442\u044B\u0439 \u0447\u0435\u043A\u0430\u0443\u0442, \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u043D\u0438\u043A\u0442\u043E \u043D\u0435 \u0441\u0442\u0430\u0432\u0438\u043B. \u041F\u043E\u0434\u043D\u0438\u043C\u0430\u0442\u044C \u0438\u0445 \u041D\u0415 \u041D\u0410\u0414\u041E, \u044D\u0442\u043E \u0434\u043E\u0440\u043E\u0436\u0435 \u0432\u0441\u0435\u0433\u043E \u0440\u0435\u0432\u044C\u044E: \u0441\u043A\u0430\u0436\u0438 \u0432 \u0432\u0435\u0440\u0434\u0438\u043A\u0442\u0435 \xAB\u043F\u0440\u043E\u0433\u043D\u0430\u0442\u044C \u043D\u0435 \u043C\u043E\u0433, \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F \u043D\u0435\u0442\xBB \u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u044C \u0442\u0435\u0441\u0442 \u0427\u0422\u0415\u041D\u0418\u0415\u041C. \u0422\u0440\u0438 \u0441\u043F\u043E\u0441\u043E\u0431\u0430 \u0441\u043E\u0432\u0440\u0430\u0442\u044C \u0437\u0435\u043B\u0451\u043D\u044B\u043C, \u0432\u0438\u0434\u043D\u044B\u0435 \u0433\u043B\u0430\u0437\u0430\u043C\u0438: (\u0430) \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0433\u043B\u043E\u0447\u0435\u043D\u043E (`try/except`, \u0437\u043E\u043D\u0442 \u0441\u0442\u043E\u0440\u043E\u0436\u0430, `.catch(() => {})`) \u2014 \u0442\u0435\u0441\u0442 \u043D\u0435 \u043F\u0430\u0434\u0430\u0435\u0442 \u0442\u0430\u043C, \u0433\u0434\u0435 \u043E\u0431\u044F\u0437\u0430\u043D; (\u0431) \u0430\u0441\u0441\u0435\u0440\u0442 \u043D\u0430 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435, \u0432\u0435\u0440\u043D\u043E\u0435 \u0432\u0441\u0435\u0433\u0434\u0430, \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E \u043E\u0442 \u043F\u0440\u0430\u0432\u043A\u0438; (\u0432) \u0442\u0435\u0441\u0442 \u043D\u0435 \u043F\u0440\u043E\u0445\u043E\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0438\u0437\u043C\u0435\u043D\u0451\u043D\u043D\u044B\u0439 \u0433\u0435\u0439\u0442 \u0432\u043E\u0432\u0441\u0435 \u2014 \u0434\u0451\u0440\u0433\u0430\u0435\u0442 \u0441\u043E\u0441\u0435\u0434\u043D\u0438\u0439 \u043F\u0443\u0442\u044C.",
19330
- "- [ ] \u041D\u0430\u043F\u0438\u0441\u0430\u043D\u043E \u0437\u0430\u043D\u043E\u0432\u043E \u0442\u043E, \u0447\u0442\u043E \u0443\u0436\u0435 \u0435\u0441\u0442\u044C \u0432 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u0438: \u043D\u043E\u0432\u044B\u0439 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442, \u0443\u0442\u0438\u043B\u0438\u0442\u0430 \u0438\u043B\u0438 \u0445\u0435\u043B\u043F\u0435\u0440 \u043F\u0440\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0435\u043C \u0430\u043D\u0430\u043B\u043E\u0433\u0435 \u0432 \u0434\u0438\u0437\u0430\u0439\u043D-\u0441\u0438\u0441\u0442\u0435\u043C\u0435 \u0438\u043B\u0438 \u043E\u0431\u0449\u0435\u043C \u043F\u0430\u043A\u0435\u0442\u0435 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 (\u0433\u0434\u0435 \u043E\u043D\u0438 \u043B\u0435\u0436\u0430\u0442 \u2014 \u0432 CLAUDE.md \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F, \u0435\u0441\u043B\u0438 \u043E\u043D \u0435\u0441\u0442\u044C). \u0414\u0443\u0431\u043B\u0438\u043A\u0430\u0442 \u043F\u043E\u0434 \u0434\u0440\u0443\u0433\u0438\u043C \u0438\u043C\u0435\u043D\u0435\u043C \u2014 \u043D\u0430\u0445\u043E\u0434\u043A\u0430.",
19331
- '- [ ] \u0418\u043C\u043F\u043E\u0440\u0442 \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043D\u0438\u0446\u0443 \u043F\u0430\u043A\u0435\u0442\u0430: \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0443\u0442\u044C \u0432\u0433\u043B\u0443\u0431\u044C \u0447\u0443\u0436\u043E\u0433\u043E \u043F\u0430\u043A\u0435\u0442\u0430 \u0438\u043B\u0438 subpath \u0432\u0438\u0434\u0430 `<\u043F\u0430\u043A\u0435\u0442>/src/\u2026` \u0432\u043C\u0435\u0441\u0442\u043E \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0433\u043E \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430 \u2014 \u043D\u0430\u0445\u043E\u0434\u043A\u0430. \u0410\u0432\u0442\u043E\u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0433\u0440\u0430\u043D\u0438\u0446 \u043F\u0430\u043A\u0435\u0442\u043E\u0432, \u0435\u0441\u043B\u0438 \u043E\u043D\u0430 \u0432 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u0438 \u0435\u0441\u0442\u044C, \u043E\u0431\u044B\u0447\u043D\u043E \u043B\u043E\u0432\u0438\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 `from "../\u2026"`; subpath \u0447\u0435\u0440\u0435\u0437 \u0438\u043C\u044F \u043F\u0430\u043A\u0435\u0442\u0430 \u0438 require/\u0434\u0438\u043D\u0430\u043C\u0438\u0447\u0435\u0441\u043A\u0438\u0439 import \u043C\u0438\u043C\u043E \u043D\u0435\u0451 \u043F\u0440\u043E\u0445\u043E\u0434\u044F\u0442 \u043D\u0435\u0437\u0430\u043C\u0435\u0447\u0435\u043D\u043D\u044B\u043C\u0438.',
19332
- "- [ ] \u0410\u0431\u0441\u0442\u0440\u0430\u043A\u0446\u0438\u044F \u0431\u0435\u0437 \u0432\u0442\u043E\u0440\u043E\u0433\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044F: \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0444\u0430\u0431\u0440\u0438\u043A\u0430 \u0438\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \xAB\u043D\u0430 \u0432\u044B\u0440\u043E\u0441\u0442\xBB \u043F\u0440\u0438 \u043E\u0434\u043D\u043E\u043C \u0432\u044B\u0437\u044B\u0432\u0430\u044E\u0449\u0435\u043C \u2014 \u043D\u0430\u0445\u043E\u0434\u043A\u0430. \u041F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u043C \u043A\u043E\u0434 \u0434\u0435\u043B\u0430\u044E\u0442 \u043F\u0440\u0438 \u0412\u0422\u041E\u0420\u041E\u041C \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0435, \u043D\u0435 \u0437\u0430\u0440\u0430\u043D\u0435\u0435.",
19333
- "- [ ] \u0414\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043B\u043E\u0433\u0438\u043A\u0438: \u0442\u043E\u0442 \u0436\u0435 \u0440\u0430\u0441\u0447\u0451\u0442, \u043D\u043E\u0440\u043C\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0438\u043B\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0443\u0436\u0435 \u0435\u0441\u0442\u044C \u0432 \u0441\u043E\u0441\u0435\u0434\u043D\u0435\u043C \u0444\u0430\u0439\u043B\u0435 \u2014 \u043D\u0430\u0445\u043E\u0434\u043A\u0430.",
19334
- "- [ ] \u041F\u0440\u0430\u0432\u043A\u0430 \u043E\u0431\u0449\u0435\u0433\u043E \u0445\u0440\u0435\u0431\u0442\u0430 \u0432\u043F\u0435\u0440\u0435\u043C\u0435\u0448\u043A\u0443 \u0441 \u0444\u0438\u0447\u0435\u0439: \u0447\u0442\u043E \u0432 \u044D\u0442\u043E\u043C \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u0438 \u0445\u0440\u0435\u0431\u0435\u0442 (\u043E\u0431\u0449\u0438\u0435 \u043F\u0430\u043A\u0435\u0442\u044B, \u0441\u0445\u0435\u043C\u0430 \u0411\u0414, \u0440\u043E\u0443\u0442\u0438\u043D\u0433\u2026) \u2014 \u0441\u043C\u043E\u0442\u0440\u0438 CLAUDE.md \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u0438\u043B\u0438 \u043F\u0440\u043E\u0444\u0438\u043B\u044C \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F (spine). \u0422\u0430\u043A\u0430\u044F \u043F\u0440\u0430\u0432\u043A\u0430 \u0432 \u043E\u0434\u043D\u043E\u043C PR \u0441 \u0444\u0438\u0447\u0435\u0439 \u2014 \u043D\u0430\u0445\u043E\u0434\u043A\u0430: \u0445\u0440\u0435\u0431\u0442\u0443 \u043D\u0443\u0436\u0435\u043D \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439 PR."
19335
- ].join("\n");
19321
+ var REVIEW_SKILL_PATH = join34(bundledRoleDir("drone"), "skills", "taskless-review", "SKILL.md");
19322
+ function reviewDefectClasses(skillPath = REVIEW_SKILL_PATH) {
19323
+ const text = readFileSync25(skillPath, "utf8");
19324
+ const m = /^## Классы дефектов\n([\s\S]*?)(?=^## |(?![\s\S]))/m.exec(text);
19325
+ if (!m) throw new Error(`${skillPath}: \u043D\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043B\u0430 \xAB## \u041A\u043B\u0430\u0441\u0441\u044B \u0434\u0435\u0444\u0435\u043A\u0442\u043E\u0432\xBB \u2014 \u0444\u043E\u0440\u043C\u0430\u0442 skill taskless-review \u043F\u043E\u043C\u0435\u043D\u044F\u043B\u0441\u044F?`);
19326
+ return `\u041A\u043B\u0430\u0441\u0441\u044B \u0434\u0435\u0444\u0435\u043A\u0442\u043E\u0432 (skill taskless-review):
19327
+ ${m[1].trim()}`;
19328
+ }
19336
19329
  function buildReviewChecklist(reviewRun, files, priorReview, verifyMode = SWARM_VERIFY) {
19337
19330
  const header = files.length ? `\u0424\u0430\u0439\u043B\u044B \u0434\u0438\u0444\u0444\u0430 (${files.length}):
19338
19331
  ${files.map((f) => `- ${f}`).join("\n")}` : "\u0424\u0430\u0439\u043B\u044B \u0434\u0438\u0444\u0444\u0430: gh \u043D\u0435 \u043E\u0442\u0434\u0430\u043B \u0441\u043F\u0438\u0441\u043E\u043A \u2014 \u0441\u043C. PR.";
@@ -19353,7 +19346,7 @@ ${priorReview}` : "",
19353
19346
  "- [ ] \u0417\u0430\u043C\u0435\u0447\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u0448\u043B\u043E\u0433\u043E \u0432\u0435\u0440\u0434\u0438\u043A\u0442\u0430 \u0437\u0430\u043A\u0440\u044B\u0442\u044B \u2014 \u043F\u043E \u043A\u0430\u0436\u0434\u043E\u043C\u0443 \u043F\u0443\u043D\u043A\u0442\u0443.",
19354
19347
  `- [ ] \u0420\u0435\u0433\u0440\u0435\u0441\u0441\u0430 \u043D\u0435\u0442: ${ciTrustLine(prUrl, verifyMode)}`,
19355
19348
  "- [ ] \u041D\u043E\u0432\u044B\u0435 \u043A\u043E\u043C\u043C\u0438\u0442\u044B \u043D\u0435 \u043F\u0440\u0438\u0432\u043D\u0435\u0441\u043B\u0438 \u043D\u043E\u0432\u044B\u0445 \u043F\u0440\u043E\u0431\u043B\u0435\u043C: \u0433\u043E\u043D\u043A\u0438/\u043C\u0438\u0433\u0440\u0430\u0446\u0438\u0438/UI \u043F\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u043C\u043E\u0441\u0442\u0438 \u2014 \u0438 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E \u043F\u0440\u0430\u0432\u0430 \u0430\u043A\u0442\u043E\u0440\u0430, \u0434\u0435\u0444\u043E\u043B\u0442 \u043F\u0440\u0438 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0434\u0430\u043D\u043D\u044B\u0445, \u043F\u043E\u043B\u043D\u043E\u0442\u0430 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432. \u041F\u0440\u0430\u0432\u043A\u0430 \u043F\u043E \u0432\u0435\u0440\u0434\u0438\u043A\u0442\u0443 \u0442\u0440\u043E\u0433\u0430\u0435\u0442 \u0442\u0435 \u0436\u0435 \u043C\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u0434\u0435\u0444\u0435\u043A\u0442 \u0438 \u0431\u044B\u043B, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0438\u043C\u0435\u043D\u043D\u043E \u043E\u043D\u0430 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043E \u043F\u0440\u0438\u043D\u043E\u0441\u0438\u0442 \u043D\u043E\u0432\u044B\u0439.",
19356
- // Единственный класс из REVIEW_DEFECT_CLASSES, который на втором круге обязателен:
19349
+ // Единственный класс из reviewDefectClasses(), который на втором круге обязателен:
19357
19350
  // правки по вердикту почти всегда приносят НОВЫЕ тесты, и именно тут прошёл #819.
19358
19351
  // Остальные классы (включая пять про качество кода, TASWM-559) заново не гоняем —
19359
19352
  // ре-чек намеренно короткий (TASWM-437).
@@ -19368,10 +19361,8 @@ ${priorReview}` : "",
19368
19361
  verifyMode === "local" ? "\u0427\u0435\u043A-\u043B\u0438\u0441\u0442 (\u0433\u0435\u0439\u0442 \u044D\u0442\u043E\u0433\u043E \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u0433\u043E\u043D\u044F\u0435\u0448\u044C \u0442\u044B \u0441\u0430\u043C \u2014 \u0441\u043C. \u043F\u0435\u0440\u0432\u044B\u0439 \u043F\u0443\u043D\u043A\u0442; \u0434\u0430\u043B\u044C\u0448\u0435 \u0440\u0443\u043A\u0430\u043C\u0438 \u0442\u043E, \u0447\u0435\u0433\u043E \u043F\u0440\u043E\u0433\u043E\u043D \u043D\u0435 \u043F\u043E\u043A\u0440\u044B\u0432\u0430\u0435\u0442):" : "\u0427\u0435\u043A-\u043B\u0438\u0441\u0442 (\u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0439 \u0440\u0443\u043A\u0430\u043C\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u043E, \u0447\u0435\u0433\u043E CI \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438 \u043D\u0435 \u043F\u043E\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u2014 \u043D\u0435 \u0432\u0435\u0440\u044C \u0446\u0438\u0444\u0440\u0430\u043C \u0430\u0432\u0442\u043E\u0440\u0430 PR):",
19369
19362
  `- [ ] ${ciTrustLine(prUrl, verifyMode)}`,
19370
19363
  "",
19371
- REVIEW_DEFECT_CLASSES,
19364
+ reviewDefectClasses(),
19372
19365
  "",
19373
- "- [ ] \u041C\u0438\u0433\u0440\u0430\u0446\u0438\u0438 (\u0435\u0441\u043B\u0438 \u0435\u0441\u0442\u044C) \u2014 \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C \u0441\u043E \u0441\u0442\u0430\u0440\u044B\u043C\u0438 \u0434\u0430\u043D\u043D\u044B\u043C\u0438, \u043E\u0442\u043A\u0430\u0442.",
19374
- "- [ ] \u0413\u043E\u043D\u043A\u0438 \u2014 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439, \u0438\u0434\u0435\u043C\u043F\u043E\u0442\u0435\u043D\u0442\u043D\u043E\u0441\u0442\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E\u0433\u043E \u0432\u044B\u0437\u043E\u0432\u0430.",
19375
19366
  "- [ ] UI-\u0434\u0438\u0441\u0446\u0438\u043F\u043B\u0438\u043D\u0430 (\u0434\u043B\u044F web-PR) \u2014 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0438\u0437\u0430\u0439\u043D-\u0441\u0438\u0441\u0442\u0435\u043C\u0435 (uikit), \u0441\u043A\u0440\u0438\u043D\u044B mobile+desktop \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u044B \u041A \u0417\u0410\u0414\u0410\u0427\u0415 (done(screenshots), TASWM-294), \u0430 \u043D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u043A PR.",
19376
19367
  "- [ ] \u0415\u0441\u043B\u0438 \u043F\u0440\u0430\u0432\u0438\u0442\u0441\u044F router.tsx \u2014 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0430 per-page meta \u0434\u043B\u044F \u0430\u0433\u0435\u043D\u0442\u0441\u043A\u043E\u0433\u043E \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0430 (\u0438\u043D\u0430\u0447\u0435 NL-\u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F \u043C\u043E\u043B\u0447\u0430 \u043B\u043E\u043C\u0430\u0435\u0442\u0441\u044F)."
19377
19368
  ].join("\n");
@@ -23734,6 +23725,7 @@ export {
23734
23725
  REVIEW_ESCALATION_MARK,
23735
23726
  REVIEW_NO_VERDICT_REASON,
23736
23727
  REVIEW_PR_UNKNOWN_MARK,
23728
+ REVIEW_SKILL_PATH,
23737
23729
  REVIEW_SPAWN_LIMIT,
23738
23730
  REVIEW_UNRECOVERABLE_MARK,
23739
23731
  SELF_REFERENCE_MARK,
@@ -23768,6 +23760,7 @@ export {
23768
23760
  resolveConflict,
23769
23761
  respawnRun,
23770
23762
  reviewBudgetMark,
23763
+ reviewDefectClasses,
23771
23764
  reviewUnrecoverableMark,
23772
23765
  reviveStuck,
23773
23766
  runDaemon,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taskless-app/swarm",
3
- "version": "0.6.52",
3
+ "version": "0.6.53",
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": "f77e0473fd2f80e4418ceadd1b29b9a70241fc04",
42
+ "gitHead": "f37d4b58b165539b1cc2585090d500a1dca39dad",
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",
package/roles/README.md CHANGED
@@ -26,6 +26,58 @@
26
26
  `.claude/skills/` репозитория — иначе он доставляется дважды (инвариант закреплён тестом
27
27
  `bundledRoleDir` в `src/launcher.test.ts`).
28
28
 
29
+ ## Skills процесса — из набора agent-kit (MCP-78)
30
+
31
+ `taskless-build`, `taskless-check`, `taskless-review`, `taskless-debug` в `drone/skills/` —
32
+ **не свои тексты**, а побайтовая копия набора `packages/agent-kit/skills/`: люди работают
33
+ по плагину Taskless, дроны — по тому же тексту. Править их здесь нельзя — правка уедет при
34
+ следующей синхронизации. Порядок такой:
35
+
36
+ 1. поправил skill в `packages/agent-kit/skills/`;
37
+ 2. `node scripts/sync-drone-skills.mjs` (из корня монорепо) — перезаписал копию;
38
+ 3. закоммитил обе стороны вместе.
39
+
40
+ Забыл шаг 2 — краснеет `src/droneSkills.test.ts` (он зовёт тот же скрипт с `--check`), а
41
+ `prepublishOnly` не даст опубликовать пакет с разошедшейся копией.
42
+
43
+ Почему копия лежит в git, а не пишется при сборке: демон в монорепо запускается из `src/`
44
+ через tsx, и дрон получает `roles/drone` вообще без сборки — копия «только в dist»
45
+ оставила бы его без skills. Симлинк `npm pack` в файлы не разворачивает.
46
+
47
+ Классы дефектов ревьюера роя (`reviewDefectClasses` в `src/overmind.ts`) читаются из раздела
48
+ «Классы дефектов» этой же копии `taskless-review` — новый класс заводится в skill набора.
49
+
50
+ Дисциплинарные skills роя не повторяют набор: что считать проверенным — `taskless-check`,
51
+ `swarm-verify-green` добавляет только ройное (итог, а не первые строки; тяжёлый прогон — в
52
+ файл; red flags). Остальные skills набора (`taskless-start`, `-shape`, `-ship`,
53
+ `-po-chelovecheski`) дрону не едут: задачу ему ставит оператор, сдачу ведёт ПРОТОКОЛ СДАЧИ
54
+ брифа. Поэтому ссылки «сдача по `taskless-ship`» в тексте набора для дрона — мимо, их
55
+ заменяет бриф.
56
+
57
+ ## Бюджет контекста роли дрона
58
+
59
+ Посчитано 28.09.2026 (MCP-78) по `SKILL.md` — это то, что skill занимает в контексте, когда
60
+ вызван; справочные файлы рядом (`taskless-debug/*.md`) читаются по требованию и сюда не
61
+ входят. Токенизатора под рукой нет, поэтому оценка: кириллица — 2,5 символа на токен,
62
+ остальное — 3,5.
63
+
64
+ | skill | символов | ≈ токенов |
65
+ |---|---:|---:|
66
+ | swarm-save-often | 2 691 | 830 |
67
+ | swarm-merge-main | 2 868 | 870 |
68
+ | swarm-await-process | 2 578 | 760 |
69
+ | swarm-verify-green | 4 315 | 1 520 |
70
+ | taskless-build | 3 552 | 1 300 |
71
+ | taskless-check | 3 019 | 1 110 |
72
+ | taskless-review | 4 237 | 1 570 |
73
+ | taskless-debug | 4 182 | 1 530 |
74
+ | **роль дрона, итого** | **27 442** | **≈ 9 500** |
75
+
76
+ До MCP-78 роль весила ≈ 7 050 (из них `systematic-debugging` — 2 800,
77
+ `swarm-verify-green` — 1 800). В монорепо Taskless к роли добавляются skills репозитория
78
+ `.claude/skills/` — ещё ≈ 10 200, вместе ≈ 19 700 из ~25k. Запас ≈ 5k: новый skill в роль
79
+ кладём, только если он окупает эти токены у каждого дрона.
80
+
29
81
  Чужие скиллы — только через аудит (trigger phrases, нет сетевого egress, нет рискованных
30
82
  bundled-скриптов, совместимая лицензия): чек-лист и история в
31
83
  [`../../../.claude/skills/README.md`](../../../.claude/skills/README.md).
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swarm-drone",
3
- "description": "Ролевой набор скиллов дрона роя, который едет С РОЕМ, а не с репозиторием: дисциплина, верная для любого проекта (сохраняться часто, вливать базовую ветку не ребейзом, ждать условие вместо sleep, что считать зелёным) плюс vendored systematic-debugging (MIT, superpowers 6.0.3). Подкладывается дрону через --plugin-dir из пакета @taskless-app/swarm, поэтому доступен и в чужом репозитории, где ни одного нашего файла нет. Знания о конкретном проекте (как поднять стек, как гонять тесты, UI-правила) сюда НЕ кладём — им место в .claude/skills/ самого репозитория.",
3
+ "description": "Ролевой набор скиллов дрона роя, который едет С РОЕМ, а не с репозиторием: дисциплина, верная для любого проекта (сохраняться часто, вливать базовую ветку не ребейзом, ждать условие вместо sleep, что считать зелёным) плюс skills процесса taskless-build, taskless-check, taskless-review, taskless-debug — копия из набора packages/agent-kit, тот же текст, что у людей в плагине Taskless (MCP-78). Подкладывается дрону через --plugin-dir из пакета @taskless-app/swarm, поэтому доступен и в чужом репозитории, где ни одного нашего файла нет. Знания о конкретном проекте (как поднять стек, как гонять тесты, UI-правила) сюда НЕ кладём — им место в .claude/skills/ самого репозитория.",
4
4
  "version": "1.0.0",
5
5
  "author": {
6
6
  "name": "taskless swarm"
@@ -36,9 +36,8 @@ done
36
36
 
37
37
  Poll intervals: ~0.5–1s for a local process/port, ~30s+ for a remote API (rate
38
38
  limits). Always give the loop a hard ceiling so a stuck process fails loud
39
- instead of hanging forever. `systematic-debugging` (vendored for drones as
40
- `swarm-drone:systematic-debugging`) ships a `condition-based-waiting` reference
41
- with the same principle for async code.
39
+ instead of hanging forever. `swarm-drone:taskless-debug` (skill набора agent-kit)
40
+ ships a `condition-based-waiting` reference with the same principle for async code.
42
41
 
43
42
  ## Headless drones: keep long work BLOCKING (don't background to wait)
44
43
 
@@ -15,36 +15,21 @@ metadata:
15
15
 
16
16
  # Verify before you say done — evidence, not intent
17
17
 
18
- Claiming work is complete without running the check is not efficiency, it's a
19
- guess. Этот скилл — универсальная половина гейта: он говорит, ЧТО считается
20
- зелёным. Вторая половина живёт в репозитории проекта (его скиллы / README /
21
- CONTRIBUTING): КАКИМИ командами это зелёное получить.
18
+ Что считается проверенным — в skill набора **`swarm-drone:taskless-check`**, тот же
19
+ текст, по которому работают люди: запуском, а не чтением; зелёное из кеша — не прогон;
20
+ полный набор — один раз перед сдачей; скрины интерфейса — в задачу; отчёт по каждому
21
+ критерию с доказательством; сломанное окружение назвать, а не чинить. Здесь — только
22
+ то, что добавляет рой. КАКИЕ команды дают зелёное в конкретном репозитории — в скиллах
23
+ самого репозитория.
22
24
 
23
25
  **Iron rule:** если ты не прогнал проверку в этой сессии, только что — ты не можешь
24
26
  утверждать, что она проходит. «Should pass» / «seems fine» / «выглядит правильно» —
25
27
  не доказательство.
26
28
 
27
- ## Что считается зелёным
28
-
29
- 1. **Проверка реально ИСПОЛНИЛАСЬ, а не отыгралась из кеша.** Сборочные системы с
30
- кешем (turbo, nx, gradle, bazel, ccache, CI-кеши) отдают прошлый результат
31
- мгновенно, если хеш входов не поменялся — и печатают это в выводе (`cache hit`,
32
- `FULL TURBO`, `up-to-date`, `>>> replayed`). Зелёное из кеша не значит, что твой
33
- код проверили: перепрогони принудительно (флаг вида `--force`/`--no-cache`) и
34
- покажи строку, где видно реальный прогон.
35
- 2. **Ноль упавших, а не «в основном зелёно».** Прочитай ИТОГ, не первые строки; не
36
- экстраполируй с частичного прогона на весь сьют.
37
- 3. **Проверка покрывает именно твоё изменение.** Зелёный сьют, который не касается
38
- твоего кода, ничего о нём не говорит — найди (или прогони) то, что его касается.
39
- 4. **Изменил видимое поведение — прогони его.** «Компилируется» это не «работает»:
40
- пройди сценарий на живом приложении (встроенный скилл `/verify`, рецепт запуска —
41
- в скиллах репозитория). Для UI — скрины mobile + desktop в задачу.
42
- 5. **Доказательство приложено.** В сдаче — сам вывод (итоговая строка, exit 0,
43
- наблюдаемое поведение), а не утверждение «проверил».
44
-
45
- Нечего прогнать (в проекте нет проверок вовсе) — это факт о проекте, а не
46
- разрешение молча сдать: скажи прямо, чем проверял вместо них. Инфраструктуру
47
- проекта под гейт роя НЕ достраивай.
29
+ - **Ноль упавших, а не «в основном зелёно».** Прочитай ИТОГ, не первые строки; не
30
+ экстраполируй с частичного прогона на весь сьют.
31
+ - **Проверка покрывает именно твоё изменение.** Зелёный сьют, который не касается
32
+ твоего кода, ничего о нём не говорит — найди (или прогони) то, что его касается.
48
33
 
49
34
  ## Тяжёлый прогон — в файл, а не в контекст
50
35
 
@@ -76,7 +61,7 @@ grep -nE "FAIL|✗|✘|●" "$LOG" | head -40 # упавшие — точечн
76
61
  а не простыня целиком. Полнота доказательства — в цифрах итога, не в объёме.
77
62
  - То же касается `git log`, `git diff` без пути, дампа большого файла, `docker build`:
78
63
  всё, что печатает бесконечно, идёт через файл.
79
- - Это не «частичный прогон» из п. 2: прогон полный, обрезан только вывод. Экстраполяция
64
+ - Это не «частичный прогон» из списка выше: прогон полный, обрезан только вывод. Экстраполяция
80
65
  запрещена по-прежнему — итог читай, а не первые строки.
81
66
 
82
67
  ## Red flags — stop and go get evidence
@@ -85,15 +70,15 @@ grep -nE "FAIL|✗|✘|●" "$LOG" | head -40 # упавшие — точечн
85
70
  - Радость от готовности РАНЬШЕ прогона («Отлично, починил!») — сначала прогон
86
71
  - Собираешься коммитить / пушить / открывать PR / звать `done()` без свежего прогона
87
72
  - Веришь отчёту сабагента «успешно» вместо диффа в VCS и своей проверки
88
- - Кеш-хит принял за прогон (см. пункт 1)
73
+ - Кеш-хит принял за прогон (`swarm-drone:taskless-check`, «Зелёное — ещё не проверенное»)
89
74
  - Тест красный, и рука тянется подправить тест — это охота за баг-первопричиной,
90
- а не правка: `swarm-drone:systematic-debugging` (root cause до фикса)
75
+ а не правка: `swarm-drone:taskless-debug` (первопричина до фикса)
91
76
  - Красное списал на «оно и до меня падало» — проверь это на базовой ветке, а не
92
77
  предполагай
93
78
 
94
79
  ## Почему это отдельный скилл
95
80
 
96
81
  Универсальный мантра-скилл «всегда проверяй» сам по себе даёт мало — работает
97
- пара: критерий доказательства (здесь) + конкретные команды проекта (в его
82
+ пара: критерий доказательства (здесь и в `taskless-check`) + конкретные команды проекта (в его
98
83
  репозитории). Поэтому эта половина едет С РОЕМ в любой проект, а вторая остаётся у
99
84
  владельца репозитория и переживает смену стека.
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: taskless-build
3
+ description: Как делать подзадачу — лестница минимализма, критерии приёмки как первые тесты, красный тест до кода, коммиты со слагом задачи. Вызывай, когда пишешь код по ясной задаче или подзадаче из дерева, в том числе когда чинишь баг. Не вызывай для разбора большой задачи (это taskless-shape) и для вопросов без правки кода.
4
+ ---
5
+
6
+ Правила проекта главнее этого набора: где его CLAUDE.md, AGENTS.md или собственные skills расходятся с текстом ниже, следуй проекту.
7
+
8
+ # Подзадача: сначала красный тест, потом код
9
+
10
+ Как превратить подзадачу в работающий код и оставить в задаче доказательство, что он делает именно то, что просили.
11
+
12
+ ## 1. Сначала пойми, потом лестница
13
+
14
+ Прочитай задачу и код, который она трогает, пройди реальный поток данных. Потом лестница — остановись на первой ступени, которая держит:
15
+
16
+ 1. Нужно ли это вообще?
17
+ 2. Уже есть в кодовой базе? Переиспользуй.
18
+ 3. Умеет стандартная библиотека?
19
+ 4. Покрывает сама платформа?
20
+ 5. Решает уже установленная зависимость?
21
+ 6. Можно одной строкой?
22
+ 7. Только теперь — минимум кода, который работает.
23
+
24
+ Нужного переиспользуемого нет, или оно вне твоей зоны, — заведи задачу (`create_task`) с оценкой, а не пиши одноразовое на месте. Текущую задачу заблокируй или поставь заглушку со ссылкой на новую.
25
+
26
+ ## 2. Сначала тест — наша редакция
27
+
28
+ 1. Критерий приёмки — это первый тест. Каждый критерий, который можно проверить тестом, становится тестом, и все такие тесты пишутся до кода.
29
+ 2. Тест обязательно увидеть красным на текущем коде. Он должен падать, а не ломаться с ошибкой; сообщение — ожидаемое; падает он потому, что поведения нет, а не из-за опечатки. Прошёл сразу — значит, проверяет то, что уже работает: переделай тест.
30
+ 3. Потом минимум кода, пока тест не станет зелёным. Позеленел — можно чистить код, тесты при этом остаются зелёными.
31
+ 4. Доказательство — одним отчётом `report_acceptance_check` на критерий, после зелёного прогона: `state: passed`, а в `evidence` обе строки — «было красным: …» с выводом падения и «стало зелёным: …» с выводом прохода, вместе до 4000 символов. Красное отдельным отчётом не отправляй: у критерия одно поле доказательства, и следующий отчёт его перезапишет.
32
+ 5. Баг начинается с теста, который его воспроизводит и падает.
33
+ 6. Исключения известны заранее, разрешения спрашивать не нужно:
34
+ - вёрстка — доказательство дают скрины mobile и desktop в задаче (как — в `taskless-check`);
35
+ - конфиги и документы — теста нет, доказательство — запуск того, на что влияет конфиг, или ссылка на документ;
36
+ - разовая разведка — теста нет, итог в комментарии задачи со ссылками на источники.
37
+
38
+ Правило ловит самообман:
39
+
40
+ - «слишком просто для теста» — простое ломается так же, как сложное;
41
+ - «напишу тест после» — тест, который прошёл сразу, ничего не доказывает;
42
+ - «проверил руками» — ручную проверку не повторить и не показать принимающему;
43
+ - «сначала поисследую» — исследуй, но в продукт идёт код, написанный после красного теста.
44
+
45
+ ## 3. Коммиты
46
+
47
+ Коммить и пушь после каждого шага, который работает: незапушенное пропадает вместе с процессом или машиной. Слаг задачи (`PROJ-42`) ставь в сообщение коммита. У проекта свой формат коммитов, например Conventional Commits, — не ломай его: слаг идёт трейлером `Task: PROJ-42` или в описание PR.
48
+
49
+ ## 4. Журнал
50
+
51
+ Проект ведёт журнал задач (`journal/<слаг>.md` или своё место) — записывай туда ход и решения: что пробовал, что отбросил и почему. Не ведёт — не заводи; решения идут в описание PR и комментарий задачи.
52
+
53
+ ## Дальше
54
+
55
+ Критерии закрыты — проверка по `taskless-check`, сдача по `taskless-ship`.
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: taskless-check
3
+ description: Проверка перед сдачей — запуском, а не чтением кода, с доказательствами в критериях приёмки задачи. Вызывай, когда работа готова и её пора сдавать, когда отчитываешься по критериям или проверяешь чужую сдачу. Не вызывай посреди работы над кодом — там хватает тестов того, что трогаешь (это taskless-build).
4
+ ---
5
+
6
+ Правила проекта главнее этого набора: где его CLAUDE.md, AGENTS.md или собственные skills расходятся с текстом ниже, следуй проекту.
7
+
8
+ # Проверка: запуском, а не чтением
9
+
10
+ Что считать «проверено» и как оставить доказательство там, где его увидит принимающий, — в критериях приёмки задачи.
11
+
12
+ ## 1. Запускай, а не читай
13
+
14
+ Цель проверки — опровергнуть свою работу, а не подтвердить её. Каждое утверждение опирается на то, что ты запустил и увидел: прогнал команду, открыл приложение, нажал кнопку. «Должно работать» и «по коду видно» — не доказательство. Пройди путь пользователя так, как его пройдёт человек, потом соседние сценарии и хотя бы два крайних случая: пустые данные, слишком много данных, нет прав, ошибка сети.
15
+
16
+ Как поднять окружение и гонять тесты, бери из `CLAUDE.md`, `AGENTS.md` и skills проекта.
17
+
18
+ ## 2. Зелёное — ещё не проверенное
19
+
20
+ Сборщики с кешем (turbo, nx, bazel и другие) отдают результат прошлого прогона, если считают входы неизменными. Зелёная галочка из кеша ничего не говорит о твоей правке. Убедись, что прогон настоящий: в выводе нет пометки о попадании в кеш, а если есть — запусти с отключённым кешем или с флагом принудительного прогона. Тест, который не запускался, не проходил.
21
+
22
+ ## 3. Полный набор — один раз
23
+
24
+ По ходу гоняй только тесты того, что трогал. Полный набор — один раз, перед сдачей: его вывод едет в контексте до конца сессии и перечитывается на каждом шаге. Длинный вывод смотри через `tail`, итог выписывай коротко.
25
+
26
+ ## 4. Интерфейс — скрины
27
+
28
+ Менялся интерфейс — сними скрины на телефоне и на десктопе и приложи их к задаче файлом, а не коммитом в репозиторий. Снимай сам продукт, ту страницу, где пользователь это увидит, а не демо-страницу компонента. На телефоне проверь, что нет горизонтальной прокрутки.
29
+
30
+ ## 5. Отчёт по каждому критерию
31
+
32
+ По каждому критерию приёмки — `report_acceptance_check` с доказательством: строка вывода команды, ссылка на скрин, что именно увидел. Состояние ставь по факту:
33
+
34
+ - `passed` — проверил, прошло;
35
+ - `failed` — проверил, упало;
36
+ - `pending` — не проверял.
37
+
38
+ «Упала» и «не проверялась» — разные состояния. Не выдавай непроверенное за прошедшее, а упавшее — за непроверенное. Критерий с тестом закрывается одним отчётом, где есть и вывод падения до правки, и вывод прохода после (как — в `taskless-build`).
39
+
40
+ ## 6. Сломанное окружение — назвать, а не чинить
41
+
42
+ Проверка упёрлась в окружение: не поднимается база, нет доступа к сервису, падает чужой тест, который ты не трогал. Не чини инфраструктуру ради зелёной галочки и не отключай проверки. Опиши в отчёте, что не запустилось и почему, поставь критерию состояние по факту и скажи человеку.
43
+
44
+ ## Дальше
45
+
46
+ Всё доказано — сдача по `taskless-ship`.
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: taskless-debug
3
+ description: Систематическая отладка — первопричина до фикса. Вызывай, когда нашёлся баг, упал тест, сломалась сборка или код ведёт себя непонятно, и особенно когда первая быстрая правка не помогла. Не вызывай для новой фичи без поломки (это taskless-build) и для вопросов, как устроен код.
4
+ ---
5
+
6
+ Правила проекта главнее этого набора: где его CLAUDE.md, AGENTS.md или собственные skills расходятся с текстом ниже, следуй проекту.
7
+
8
+ # Отладка: сначала причина, потом фикс
9
+
10
+ Случайные правки съедают время и приносят новые баги, а заплатка на симптоме прячет настоящую поломку. Поэтому правило одно: без поиска первопричины фикс не предлагаем. Не прошёл первую фазу — чинить рано. У простых багов тоже есть причина, а спешка гарантирует переделку.
11
+
12
+ ## 1. Первопричина
13
+
14
+ 1. Прочитай ошибку целиком: сообщение, стек, номера строк, коды. Решение часто написано прямо там.
15
+ 2. Воспроизведи стабильно: точные шаги, каждый ли раз. Не воспроизводится — собирай данные, не гадай.
16
+ 3. Проверь, что менялось: дифф, свежие коммиты, новые зависимости, конфиги, разница окружений.
17
+ 4. В системе из нескольких частей (CI → сборка → подпись, API → сервис → база) сначала поставь диагностику на каждой границе: что вошло, что вышло, дошли ли переменные окружения и конфиг. Один прогон покажет, где ломается, — дальше разбирай именно это звено.
18
+ 5. Ошибка глубоко в стеке — иди по данным назад: откуда пришло плохое значение, кто его передал, и так до источника. Чини у источника, а не там, где упало. Подробно — в `root-cause-tracing.md`.
19
+
20
+ ## 2. Образец
21
+
22
+ Найди в той же кодовой базе похожее место, которое работает. Повторяешь известный образец — прочитай его целиком, а не наискосок. Выпиши все отличия рабочего от сломанного, даже мелкие, и не решай заранее, что «это не может влиять». Что нужно коду для работы: зависимости, настройки, окружение, допущения?
23
+
24
+ ## 3. Гипотеза
25
+
26
+ Одна гипотеза за раз, записанная явно: «думаю, причина в X, потому что Y». Проверяй её минимальной правкой, меняя одну переменную. Не подтвердилась — новая гипотеза, а не ещё одна правка поверх. Не понимаешь — так и скажи: «не понимаю X». Не делай вид.
27
+
28
+ ## 4. Фикс
29
+
30
+ 1. Сначала тест, который воспроизводит баг и падает (как — в `taskless-build`). Вывод падения до правки и вывод прохода после идут одним отчётом по критерию.
31
+ 2. Одна правка — по найденной причине. Без «заодно поправлю» и попутного рефакторинга.
32
+ 3. Проверь: тест зелёный, остальные не сломались, исходная проблема ушла.
33
+ 4. Не помогло — остановись и посчитай попытки. Меньше трёх — назад к первой фазе с новыми данными. Три и больше — дело, скорее всего, в устройстве: каждая правка вскрывает новую связанность в другом месте. Четвёртую не делай, обсуди с человеком, верен ли сам подход.
34
+
35
+ ## Стоп-сигналы
36
+
37
+ Поймал себя на такой мысли — вернись к первой фазе:
38
+
39
+ - «быстро поправлю, разберусь потом»;
40
+ - «поменяю X, вдруг сработает»;
41
+ - «сделаю несколько правок сразу и прогоню тесты»;
42
+ - «тест не нужен, проверю руками»;
43
+ - «наверное, это X» — без проверки;
44
+ - «ещё одна попытка» после двух неудачных.
45
+
46
+ Человек спрашивает «а это точно происходит?» или просит перестать гадать — значит, ты предполагаешь без проверки.
47
+
48
+ ## Нет первопричины
49
+
50
+ Разобрался честно, а дело во внешнем: окружение, тайминги, чужой сервис. Тогда опиши, что проверял, сделай разумную обработку (повтор, таймаут, понятная ошибка) и добавь логирование на будущее. Но чаще «причины нет» значит «искали не до конца».
51
+
52
+ ## В трекере
53
+
54
+ - Нашёл по дороге баг вне своей задачи — заведи задачу (`create_task`) с шагами воспроизведения, а не чини его молча в своём PR.
55
+ - Итог отладки — в комментарий к задаче: в чём причина и чем она подтверждена (тест, лог, воспроизведение).
56
+
57
+ ## Приёмы рядом
58
+
59
+ - `root-cause-tracing.md` — как идти по стеку назад до источника; там же `find-polluter.sh`, который ищет тест, оставляющий после себя мусор.
60
+ - `defense-in-depth.md` — проверки на нескольких слоях, когда причина уже найдена.
61
+ - `condition-based-waiting.md` — ждать условия вместо произвольных таймаутов; пример — `condition-based-waiting-example.ts`.
62
+
63
+ Основано на systematic-debugging из superpowers (MIT), атрибуция — в NOTICE плагина. Приёмы рядом перенесены из того же источника без перевода.
@@ -33,7 +33,7 @@ digraph when_to_use {
33
33
 
34
34
  ### 1. Observe the Symptom
35
35
  ```
36
- Error: git init failed in ~/project/packages/core
36
+ Error: git init failed in ~/project/lib/core
37
37
  ```
38
38
 
39
39
  ### 2. Find Immediate Cause
@@ -108,7 +108,7 @@ Runs tests one-by-one, stops at first polluter. See script for usage.
108
108
 
109
109
  ## Real Example: Empty projectDir
110
110
 
111
- **Symptom:** `.git` created in `packages/core/` (source code)
111
+ **Symptom:** `.git` created in `lib/core/` (source code)
112
112
 
113
113
  **Trace chain:**
114
114
  1. `git init` runs in `process.cwd()` ← empty cwd parameter
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: taskless-review
3
+ description: Ревью диффа по классам дефектов — своего PR перед сдачей и чужого. Вызывай перед тем, как отдать работу, когда просят посмотреть PR и когда пришли замечания к твоему. Не вызывай для проверки запуском (это taskless-check) и для разбора задачи до кода.
4
+ ---
5
+
6
+ Правила проекта главнее этого набора: где его CLAUDE.md, AGENTS.md или собственные skills расходятся с текстом ниже, следуй проекту.
7
+
8
+ # Ревью по классам дефектов
9
+
10
+ Ревью — чтение диффа с вопросами, на которые чаще всего находятся ошибки. Читай дифф и только то, чего он касается; прочитанное не перечитывай. На каждый вопрос — один заход: не нашёл ответа с первого раза — это уже находка, назови её в вердикте.
11
+
12
+ ## Классы дефектов
13
+
14
+ По каждому — ответ в вердикте. «Не применимо» — законный ответ, но с причиной в полстроки («ручек не добавлено»). «Не применимо» подряд по всем пунктам — отписка, а не ревью.
15
+
16
+ 1. Права того, кто действует, и изоляция воркспейса. Кто физически может вызвать новую ручку или нажать кнопку — человек, агент, гость, участник чужого воркспейса? Действие ради решения человека (публикация, одобрение, оплата, рассылка) явно отбивает агента, а не полагается на то, что роль у него слабее. Любой id из тела запроса сверяется с воркспейсом вызывающего: ручка без такой сверки — дыра между воркспейсами.
17
+ 2. Полнота вариантов. Добавлен вариант в enum, union или набор строк — найди все места, которые их перечисляют: белые списки, switch, маппинги, условия в интерфейсе. Проверка типов это пропускает, когда список — значение, а не исчерпывающий switch. Это один поиск по имени типа или по значению, а не чтение репозитория «для понимания».
18
+ 3. Все состояния источника: выключено, пауза, молчит, данных ещё нет, доступ закрыт. Разобраны все или только удачный путь и одна ошибка? Полный набор часто уже лежит рядом в коде.
19
+ 4. Ошибка доходит до человека. Отказ, провал валидации, конфликт видны в интерфейсе, а не только в логе или `console.warn`. Кнопка, которая молча ничего не сделала, — дефект, даже если сервер ответил верно.
20
+ 5. Безопасный дефолт, когда данных нет. Для удаляющих, публикующих и списывающих действий «нет данных» значит «не делать», а не «чисто, можно».
21
+ 6. Тесты доказывают заявленное. Окружение поднято — сними в коде проверку, которую тест сторожит (одну строку: условие, валидацию), прогони один этот тест, не весь набор, и верни файл как было: тест обязан покраснеть; остался зелёным — находка, он ничего не сторожит. Не поднято — не поднимай, это дороже всего ревью: напиши «прогнать не мог, окружения нет» и проверь чтением: не проглочено ли исключение, не ассерт ли на значение, верное всегда, проходит ли тест через изменённый путь.
22
+ 7. Написано заново то, что уже есть: компонент, утилита или хелпер при существующем аналоге в дизайн-системе или общих пакетах проекта. Где они лежат — в `CLAUDE.md` проекта.
23
+ 8. Импорт через границу пакета: относительный путь вглубь чужого пакета или `<пакет>/src/…` вместо его публичного экспорта.
24
+ 9. Абстракция без второго потребителя: интерфейс, фабрика или параметр «на вырост» при одном вызывающем. Переиспользуемым код делают при втором реальном потребителе.
25
+ 10. Дублирование логики: тот же расчёт, нормализация или формат уже есть в соседнем файле.
26
+ 11. Правка общего хребта вперемешку с фичей. Что хребет (общие пакеты, схема БД, роутинг), смотри в `CLAUDE.md` проекта. Хребту — отдельный маленький PR.
27
+
28
+ Рядом, если применимо: миграции (старые данные, откат), гонки (порядок операций, повторный вызов), интерфейс (дизайн-система проекта, скрины телефона и десктопа в задаче).
29
+
30
+ ## Своё ревью перед сдачей
31
+
32
+ Прочитай весь дифф целиком, а не последний коммит, и пройди по классам. Исправил найденное — перепроверь исправление: правка по замечанию чаще всего и приносит новый дефект.
33
+
34
+ ## Чужое ревью
35
+
36
+ Вердикт — «одобряю» или «нужны правки». Каждое замечание — место в коде (файл и строка), сценарий (какой вход даёт неверный результат) и чем чинить. Не блокирующее так и назови.
37
+
38
+ Ревьюер читает, верификатор запускает. «Одобрено чтением» не значит «работает»: сам не запускал — так и напиши в вердикте.
39
+
40
+ ## Замечания к твоему PR
41
+
42
+ Сначала проверь замечание на коде, потом чини. Ошибается — возрази фактами. Без «отличное замечание»: исправил — скажи что и где.
@@ -1,296 +0,0 @@
1
- ---
2
- name: systematic-debugging
3
- description: Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes
4
- ---
5
-
6
- # Systematic Debugging
7
-
8
- ## Overview
9
-
10
- Random fixes waste time and create new bugs. Quick patches mask underlying issues.
11
-
12
- **Core principle:** ALWAYS find root cause before attempting fixes. Symptom fixes are failure.
13
-
14
- **Violating the letter of this process is violating the spirit of debugging.**
15
-
16
- ## The Iron Law
17
-
18
- ```
19
- NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST
20
- ```
21
-
22
- If you haven't completed Phase 1, you cannot propose fixes.
23
-
24
- ## When to Use
25
-
26
- Use for ANY technical issue:
27
- - Test failures
28
- - Bugs in production
29
- - Unexpected behavior
30
- - Performance problems
31
- - Build failures
32
- - Integration issues
33
-
34
- **Use this ESPECIALLY when:**
35
- - Under time pressure (emergencies make guessing tempting)
36
- - "Just one quick fix" seems obvious
37
- - You've already tried multiple fixes
38
- - Previous fix didn't work
39
- - You don't fully understand the issue
40
-
41
- **Don't skip when:**
42
- - Issue seems simple (simple bugs have root causes too)
43
- - You're in a hurry (rushing guarantees rework)
44
- - Manager wants it fixed NOW (systematic is faster than thrashing)
45
-
46
- ## The Four Phases
47
-
48
- You MUST complete each phase before proceeding to the next.
49
-
50
- ### Phase 1: Root Cause Investigation
51
-
52
- **BEFORE attempting ANY fix:**
53
-
54
- 1. **Read Error Messages Carefully**
55
- - Don't skip past errors or warnings
56
- - They often contain the exact solution
57
- - Read stack traces completely
58
- - Note line numbers, file paths, error codes
59
-
60
- 2. **Reproduce Consistently**
61
- - Can you trigger it reliably?
62
- - What are the exact steps?
63
- - Does it happen every time?
64
- - If not reproducible → gather more data, don't guess
65
-
66
- 3. **Check Recent Changes**
67
- - What changed that could cause this?
68
- - Git diff, recent commits
69
- - New dependencies, config changes
70
- - Environmental differences
71
-
72
- 4. **Gather Evidence in Multi-Component Systems**
73
-
74
- **WHEN system has multiple components (CI → build → signing, API → service → database):**
75
-
76
- **BEFORE proposing fixes, add diagnostic instrumentation:**
77
- ```
78
- For EACH component boundary:
79
- - Log what data enters component
80
- - Log what data exits component
81
- - Verify environment/config propagation
82
- - Check state at each layer
83
-
84
- Run once to gather evidence showing WHERE it breaks
85
- THEN analyze evidence to identify failing component
86
- THEN investigate that specific component
87
- ```
88
-
89
- **Example (multi-layer system):**
90
- ```bash
91
- # Layer 1: Workflow
92
- echo "=== Secrets available in workflow: ==="
93
- echo "IDENTITY: ${IDENTITY:+SET}${IDENTITY:-UNSET}"
94
-
95
- # Layer 2: Build script
96
- echo "=== Env vars in build script: ==="
97
- env | grep IDENTITY || echo "IDENTITY not in environment"
98
-
99
- # Layer 3: Signing script
100
- echo "=== Keychain state: ==="
101
- security list-keychains
102
- security find-identity -v
103
-
104
- # Layer 4: Actual signing
105
- codesign --sign "$IDENTITY" --verbose=4 "$APP"
106
- ```
107
-
108
- **This reveals:** Which layer fails (secrets → workflow ✓, workflow → build ✗)
109
-
110
- 5. **Trace Data Flow**
111
-
112
- **WHEN error is deep in call stack:**
113
-
114
- See `root-cause-tracing.md` in this directory for the complete backward tracing technique.
115
-
116
- **Quick version:**
117
- - Where does bad value originate?
118
- - What called this with bad value?
119
- - Keep tracing up until you find the source
120
- - Fix at source, not at symptom
121
-
122
- ### Phase 2: Pattern Analysis
123
-
124
- **Find the pattern before fixing:**
125
-
126
- 1. **Find Working Examples**
127
- - Locate similar working code in same codebase
128
- - What works that's similar to what's broken?
129
-
130
- 2. **Compare Against References**
131
- - If implementing pattern, read reference implementation COMPLETELY
132
- - Don't skim - read every line
133
- - Understand the pattern fully before applying
134
-
135
- 3. **Identify Differences**
136
- - What's different between working and broken?
137
- - List every difference, however small
138
- - Don't assume "that can't matter"
139
-
140
- 4. **Understand Dependencies**
141
- - What other components does this need?
142
- - What settings, config, environment?
143
- - What assumptions does it make?
144
-
145
- ### Phase 3: Hypothesis and Testing
146
-
147
- **Scientific method:**
148
-
149
- 1. **Form Single Hypothesis**
150
- - State clearly: "I think X is the root cause because Y"
151
- - Write it down
152
- - Be specific, not vague
153
-
154
- 2. **Test Minimally**
155
- - Make the SMALLEST possible change to test hypothesis
156
- - One variable at a time
157
- - Don't fix multiple things at once
158
-
159
- 3. **Verify Before Continuing**
160
- - Did it work? Yes → Phase 4
161
- - Didn't work? Form NEW hypothesis
162
- - DON'T add more fixes on top
163
-
164
- 4. **When You Don't Know**
165
- - Say "I don't understand X"
166
- - Don't pretend to know
167
- - Ask for help
168
- - Research more
169
-
170
- ### Phase 4: Implementation
171
-
172
- **Fix the root cause, not the symptom:**
173
-
174
- 1. **Create Failing Test Case**
175
- - Simplest possible reproduction
176
- - Automated test if possible
177
- - One-off test script if no framework
178
- - MUST have before fixing
179
- - Write the failing test first, then the fix (TDD)
180
-
181
- 2. **Implement Single Fix**
182
- - Address the root cause identified
183
- - ONE change at a time
184
- - No "while I'm here" improvements
185
- - No bundled refactoring
186
-
187
- 3. **Verify Fix**
188
- - Test passes now?
189
- - No other tests broken?
190
- - Issue actually resolved?
191
-
192
- 4. **If Fix Doesn't Work**
193
- - STOP
194
- - Count: How many fixes have you tried?
195
- - If < 3: Return to Phase 1, re-analyze with new information
196
- - **If ≥ 3: STOP and question the architecture (step 5 below)**
197
- - DON'T attempt Fix #4 without architectural discussion
198
-
199
- 5. **If 3+ Fixes Failed: Question Architecture**
200
-
201
- **Pattern indicating architectural problem:**
202
- - Each fix reveals new shared state/coupling/problem in different place
203
- - Fixes require "massive refactoring" to implement
204
- - Each fix creates new symptoms elsewhere
205
-
206
- **STOP and question fundamentals:**
207
- - Is this pattern fundamentally sound?
208
- - Are we "sticking with it through sheer inertia"?
209
- - Should we refactor architecture vs. continue fixing symptoms?
210
-
211
- **Discuss with your human partner before attempting more fixes**
212
-
213
- This is NOT a failed hypothesis - this is a wrong architecture.
214
-
215
- ## Red Flags - STOP and Follow Process
216
-
217
- If you catch yourself thinking:
218
- - "Quick fix for now, investigate later"
219
- - "Just try changing X and see if it works"
220
- - "Add multiple changes, run tests"
221
- - "Skip the test, I'll manually verify"
222
- - "It's probably X, let me fix that"
223
- - "I don't fully understand but this might work"
224
- - "Pattern says X but I'll adapt it differently"
225
- - "Here are the main problems: [lists fixes without investigation]"
226
- - Proposing solutions before tracing data flow
227
- - **"One more fix attempt" (when already tried 2+)**
228
- - **Each fix reveals new problem in different place**
229
-
230
- **ALL of these mean: STOP. Return to Phase 1.**
231
-
232
- **If 3+ fixes failed:** Question the architecture (see Phase 4.5)
233
-
234
- ## your human partner's Signals You're Doing It Wrong
235
-
236
- **Watch for these redirections:**
237
- - "Is that not happening?" - You assumed without verifying
238
- - "Will it show us...?" - You should have added evidence gathering
239
- - "Stop guessing" - You're proposing fixes without understanding
240
- - "Ultra-think this" - Question fundamentals, not just symptoms
241
- - "We're stuck?" (frustrated) - Your approach isn't working
242
-
243
- **When you see these:** STOP. Return to Phase 1.
244
-
245
- ## Common Rationalizations
246
-
247
- | Excuse | Reality |
248
- |--------|---------|
249
- | "Issue is simple, don't need process" | Simple issues have root causes too. Process is fast for simple bugs. |
250
- | "Emergency, no time for process" | Systematic debugging is FASTER than guess-and-check thrashing. |
251
- | "Just try this first, then investigate" | First fix sets the pattern. Do it right from the start. |
252
- | "I'll write test after confirming fix works" | Untested fixes don't stick. Test first proves it. |
253
- | "Multiple fixes at once saves time" | Can't isolate what worked. Causes new bugs. |
254
- | "Reference too long, I'll adapt the pattern" | Partial understanding guarantees bugs. Read it completely. |
255
- | "I see the problem, let me fix it" | Seeing symptoms ≠ understanding root cause. |
256
- | "One more fix attempt" (after 2+ failures) | 3+ failures = architectural problem. Question pattern, don't fix again. |
257
-
258
- ## Quick Reference
259
-
260
- | Phase | Key Activities | Success Criteria |
261
- |-------|---------------|------------------|
262
- | **1. Root Cause** | Read errors, reproduce, check changes, gather evidence | Understand WHAT and WHY |
263
- | **2. Pattern** | Find working examples, compare | Identify differences |
264
- | **3. Hypothesis** | Form theory, test minimally | Confirmed or new hypothesis |
265
- | **4. Implementation** | Create test, fix, verify | Bug resolved, tests pass |
266
-
267
- ## When Process Reveals "No Root Cause"
268
-
269
- If systematic investigation reveals issue is truly environmental, timing-dependent, or external:
270
-
271
- 1. You've completed the process
272
- 2. Document what you investigated
273
- 3. Implement appropriate handling (retry, timeout, error message)
274
- 4. Add monitoring/logging for future investigation
275
-
276
- **But:** 95% of "no root cause" cases are incomplete investigation.
277
-
278
- ## Supporting Techniques
279
-
280
- These techniques are part of systematic debugging and available in this directory:
281
-
282
- - **`root-cause-tracing.md`** - Trace bugs backward through call stack to find original trigger
283
- - **`defense-in-depth.md`** - Add validation at multiple layers after finding root cause
284
- - **`condition-based-waiting.md`** - Replace arbitrary timeouts with condition polling
285
-
286
- **Related skills:**
287
- - Write the failing test case first, then the fix (Phase 4, Step 1) — TDD
288
- - **verify-before-done** - Verify fix worked before claiming success
289
-
290
- ## Real-World Impact
291
-
292
- From debugging sessions:
293
- - Systematic approach: 15-30 minutes to fix
294
- - Random fixes approach: 2-3 hours of thrashing
295
- - First-time fix rate: 95% vs 40%
296
- - New bugs introduced: Near zero vs common