@taskless-app/swarm 0.6.52 → 0.6.54
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 +3 -3
- package/dist/overmind.js +18 -25
- package/package.json +2 -2
- package/roles/README.md +52 -0
- package/roles/drone/.claude-plugin/plugin.json +1 -1
- package/roles/drone/skills/swarm-await-process/SKILL.md +2 -3
- package/roles/drone/skills/swarm-verify-green/SKILL.md +14 -29
- package/roles/drone/skills/taskless-build/SKILL.md +55 -0
- package/roles/drone/skills/taskless-check/SKILL.md +46 -0
- package/roles/drone/skills/taskless-debug/SKILL.md +63 -0
- package/roles/drone/skills/{systematic-debugging → taskless-debug}/root-cause-tracing.md +2 -2
- package/roles/drone/skills/taskless-review/SKILL.md +42 -0
- package/roles/drone/skills/systematic-debugging/SKILL.md +0 -296
- /package/roles/drone/skills/{systematic-debugging → taskless-debug}/condition-based-waiting-example.ts +0 -0
- /package/roles/drone/skills/{systematic-debugging → taskless-debug}/condition-based-waiting.md +0 -0
- /package/roles/drone/skills/{systematic-debugging → taskless-debug}/defense-in-depth.md +0 -0
- /package/roles/drone/skills/{systematic-debugging → taskless-debug}/find-polluter.sh +0 -0
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.
|
|
3495
|
+
version: "0.6.54",
|
|
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: "
|
|
3546
|
+
gitHead: "3b1e278b9e6191317bd081fe0d649abb2cef0e60"
|
|
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.
|
|
12492
|
+
version: "0.6.54",
|
|
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: "
|
|
12543
|
+
gitHead: "3b1e278b9e6191317bd081fe0d649abb2cef0e60"
|
|
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
|
|
19235
|
-
"3.
|
|
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),
|
|
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
|
|
19322
|
-
|
|
19323
|
-
|
|
19324
|
-
|
|
19325
|
-
|
|
19326
|
-
|
|
19327
|
-
|
|
19328
|
-
|
|
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
|
-
// Единственный класс из
|
|
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
|
-
|
|
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.
|
|
3
|
+
"version": "0.6.54",
|
|
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": "
|
|
42
|
+
"gitHead": "3b1e278b9e6191317bd081fe0d649abb2cef0e60",
|
|
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
|
+
`-writing`) дрону не едут: задачу ему ставит оператор, сдачу ведёт ПРОТОКОЛ СДАЧИ
|
|
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, что считать зелёным) плюс
|
|
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. `
|
|
40
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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
|
-
- Это не «частичный прогон» из
|
|
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
|
-
- Кеш-хит принял за прогон (
|
|
73
|
+
- Кеш-хит принял за прогон (`swarm-drone:taskless-check`, «Зелёное — ещё не проверенное»)
|
|
89
74
|
- Тест красный, и рука тянется подправить тест — это охота за баг-первопричиной,
|
|
90
|
-
а не правка: `swarm-drone:
|
|
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/
|
|
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 `
|
|
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
|
|
File without changes
|
/package/roles/drone/skills/{systematic-debugging → taskless-debug}/condition-based-waiting.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|