mister-wolf 1.0.3 → 1.1.0
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/adapters/cli/cli-entry.d.ts.map +1 -1
- package/dist/adapters/cli/cli-entry.js +2 -0
- package/dist/adapters/cli/cli-entry.js.map +1 -1
- package/dist/adapters/cli/commands/memory-init.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-init.js +33 -1
- package/dist/adapters/cli/commands/memory-init.js.map +1 -1
- package/dist/adapters/cli/commands/memory-sync.d.ts +3 -0
- package/dist/adapters/cli/commands/memory-sync.d.ts.map +1 -0
- package/dist/adapters/cli/commands/memory-sync.js +28 -0
- package/dist/adapters/cli/commands/memory-sync.js.map +1 -0
- package/dist/adapters/render/manifest.d.ts +13 -0
- package/dist/adapters/render/manifest.d.ts.map +1 -0
- package/dist/adapters/render/manifest.js +14 -0
- package/dist/adapters/render/manifest.js.map +1 -0
- package/dist/adapters/render/opencode/opencode-renderer.d.ts +22 -0
- package/dist/adapters/render/opencode/opencode-renderer.d.ts.map +1 -0
- package/dist/adapters/render/opencode/opencode-renderer.js +125 -0
- package/dist/adapters/render/opencode/opencode-renderer.js.map +1 -0
- package/dist/adapters/render/stamp.d.ts +8 -0
- package/dist/adapters/render/stamp.d.ts.map +1 -0
- package/dist/adapters/render/stamp.js +23 -0
- package/dist/adapters/render/stamp.js.map +1 -0
- package/dist/adapters/render/templates-root.d.ts +6 -0
- package/dist/adapters/render/templates-root.d.ts.map +1 -0
- package/dist/adapters/render/templates-root.js +30 -0
- package/dist/adapters/render/templates-root.js.map +1 -0
- package/dist/app/use-cases/init-project.d.ts +12 -0
- package/dist/app/use-cases/init-project.d.ts.map +1 -1
- package/dist/app/use-cases/init-project.js +13 -1
- package/dist/app/use-cases/init-project.js.map +1 -1
- package/dist/app/use-cases/seed-base-playbooks.d.ts +26 -0
- package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -0
- package/dist/app/use-cases/seed-base-playbooks.js +43 -0
- package/dist/app/use-cases/seed-base-playbooks.js.map +1 -0
- package/dist/app/use-cases/sync-base-set.d.ts +12 -0
- package/dist/app/use-cases/sync-base-set.d.ts.map +1 -0
- package/dist/app/use-cases/sync-base-set.js +10 -0
- package/dist/app/use-cases/sync-base-set.js.map +1 -0
- package/dist/ports/base-set-renderer.port.d.ts +20 -0
- package/dist/ports/base-set-renderer.port.d.ts.map +1 -0
- package/dist/ports/base-set-renderer.port.js +2 -0
- package/dist/ports/base-set-renderer.port.js.map +1 -0
- package/package.json +11 -3
- package/templates/base/README.md +1 -0
- package/templates/base/agents/executor-lead.md +79 -0
- package/templates/base/agents/mr-wolf.md +76 -0
- package/templates/base/agents/steward.md +56 -0
- package/templates/base/agents/worker-implementer.md +58 -0
- package/templates/base/agents/worker-researcher.md +59 -0
- package/templates/base/agents/worker-reviewer.md +58 -0
- package/templates/base/commands/analyze-doc.md +11 -0
- package/templates/base/commands/complain.md +13 -0
- package/templates/base/commands/doc-review.md +15 -0
- package/templates/base/playbooks/complaint-protocol.md +39 -0
- package/templates/base/playbooks/steward-nastavnik.md +38 -0
- package/templates/base/playbooks/wolf-review-lenses.md +50 -0
- package/templates/base/playbooks/worker-implementer-playbook.md +51 -0
- package/templates/base/playbooks/worker-researcher-playbook.md +51 -0
- package/templates/base/playbooks/worker-reviewer-playbook.md +54 -0
- package/templates/base/skills/finishing-a-development-branch/SKILL.md +213 -0
- package/templates/base/skills/requesting-code-review/SKILL.md +123 -0
- package/templates/base/skills/test-driven-development/SKILL.md +391 -0
- package/templates/base/skills/using-git-worktrees/SKILL.md +178 -0
- package/templates/base/skills/using-skills/SKILL.md +128 -0
- package/templates/base/skills/verification-before-completion/SKILL.md +157 -0
- package/templates/base/skills/wolf-brainstorm/SKILL.md +167 -0
- package/templates/base/skills/wolf-debug/SKILL.md +293 -0
- package/templates/base/skills/wolf-execute/SKILL.md +96 -0
- package/templates/base/skills/wolf-handoff/SKILL.md +101 -0
- package/templates/base/skills/wolf-plan/SKILL.md +177 -0
- package/templates/base/skills/wolf-review/SKILL.md +61 -0
- package/templates/base/skills/wolf-sdd/SKILL.md +239 -0
- package/templates/opencode/README.md +1 -0
- package/templates/opencode/plugins/wolf-router.ts +104 -0
- package/templates/opencode/plugins/wolf-session-start.js +144 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
function parseFrontmatter(raw) {
|
|
2
|
+
const m = raw.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
|
3
|
+
if (!m)
|
|
4
|
+
return { meta: {}, body: raw };
|
|
5
|
+
const meta = {};
|
|
6
|
+
for (const line of m[1].split('\n')) {
|
|
7
|
+
const kv = line.match(/^([\w-]+):\s*(.+)$/);
|
|
8
|
+
if (kv)
|
|
9
|
+
meta[kv[1]] = kv[2].trim();
|
|
10
|
+
}
|
|
11
|
+
return { meta, body: m[2] };
|
|
12
|
+
}
|
|
13
|
+
/** Посев (спека §7): скип по owner_skill (MAJ-3/C2), не по пересечению тегов. */
|
|
14
|
+
export async function seedBasePlaybooks(deps) {
|
|
15
|
+
const outcomes = [];
|
|
16
|
+
// ponytail: без .sort() — план-тест ожидает порядок вставки Map (added[0]=steward); порядок посева функционально не важен
|
|
17
|
+
for (const [file, raw] of deps.files) {
|
|
18
|
+
const { meta, body } = parseFrontmatter(raw);
|
|
19
|
+
const ownerSkill = meta.owner_skill ?? '';
|
|
20
|
+
if (deps.isSeeded && (await deps.isSeeded(ownerSkill))) {
|
|
21
|
+
outcomes.push({ file, action: 'skipped', reason: `owner_skill=${ownerSkill} уже в памяти (R2-M3)` });
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const steps = (meta.steps ?? '')
|
|
25
|
+
.split('|')
|
|
26
|
+
.map((s) => s.trim())
|
|
27
|
+
.filter(Boolean);
|
|
28
|
+
await deps.add({
|
|
29
|
+
type: 'playbook',
|
|
30
|
+
title: meta.title ?? file,
|
|
31
|
+
body,
|
|
32
|
+
createdBy: 'wolf-init',
|
|
33
|
+
tags: (meta.tags ?? '')
|
|
34
|
+
.split(',')
|
|
35
|
+
.map((t) => t.trim())
|
|
36
|
+
.filter(Boolean),
|
|
37
|
+
extra: { owner_skill: ownerSkill, version: meta.version ?? '1', steps },
|
|
38
|
+
});
|
|
39
|
+
outcomes.push({ file, action: 'created' });
|
|
40
|
+
}
|
|
41
|
+
return outcomes;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=seed-base-playbooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-base-playbooks.js","sourceRoot":"","sources":["../../../src/app/use-cases/seed-base-playbooks.ts"],"names":[],"mappings":"AAuBA,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC1D,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACvC,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC5C,IAAI,EAAE;YAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9B,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAc;IACpD,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,0HAA0H;IAC1H,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,UAAU,uBAAuB,EAAE,CAAC,CAAC;YACrG,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;aAC7B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,MAAM,IAAI,CAAC,GAAG,CAAC;YACb,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;YACzB,IAAI;YACJ,SAAS,EAAE,WAAW;YACtB,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;iBACpB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC;YAClB,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,GAAG,EAAE,KAAK,EAAE;SACxE,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseSetRenderer } from '../../ports/base-set-renderer.port.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sync (спека §7): только штампованные файлы; orphaned — в отчёт;
|
|
4
|
+
* память (.wolf/, seeded playbook'и) НЕ трогается никогда (мутации — зона Стюарда, D4).
|
|
5
|
+
* Bake-in при sync не используется: opencode = plugin-inject; bake-in — механизм
|
|
6
|
+
* минимальных платформ (вызывается адаптером с BakeResolver, Task 4).
|
|
7
|
+
*/
|
|
8
|
+
export declare function syncBaseSet(renderer: BaseSetRenderer, baseDir: string): Promise<{
|
|
9
|
+
outcomes: import("../../ports/base-set-renderer.port.js").RenderOutcome[];
|
|
10
|
+
orphaned: string[];
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=sync-base-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-base-set.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/sync-base-set.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM;;;GAE3E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync (спека §7): только штампованные файлы; orphaned — в отчёт;
|
|
3
|
+
* память (.wolf/, seeded playbook'и) НЕ трогается никогда (мутации — зона Стюарда, D4).
|
|
4
|
+
* Bake-in при sync не используется: opencode = plugin-inject; bake-in — механизм
|
|
5
|
+
* минимальных платформ (вызывается адаптером с BakeResolver, Task 4).
|
|
6
|
+
*/
|
|
7
|
+
export async function syncBaseSet(renderer, baseDir) {
|
|
8
|
+
return renderer.syncBaseSet(baseDir);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=sync-base-set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-base-set.js","sourceRoot":"","sources":["../../../src/app/use-cases/sync-base-set.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAyB,EAAE,OAAe;IAC1E,OAAO,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type RenderAction = 'created' | 'skipped' | 'updated' | 'conflict';
|
|
2
|
+
export interface RenderOutcome {
|
|
3
|
+
file: string;
|
|
4
|
+
action: RenderAction;
|
|
5
|
+
reason?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface BakeResolver {
|
|
8
|
+
/** Вернуть тело playbook'а для вживления (bake-in) или null. Источник — память целевого проекта (§4). */
|
|
9
|
+
(baseName: string): string | null;
|
|
10
|
+
}
|
|
11
|
+
export interface BaseSetRenderer {
|
|
12
|
+
id: string;
|
|
13
|
+
renderBaseSet(baseDir: string, bake?: BakeResolver): Promise<RenderOutcome[]>;
|
|
14
|
+
/** Sync: ре-рендер; сравнение по контенту; unstamped = conflict; orphaned-отчёт. Память не трогает. */
|
|
15
|
+
syncBaseSet(baseDir: string): Promise<{
|
|
16
|
+
outcomes: RenderOutcome[];
|
|
17
|
+
orphaned: string[];
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=base-set-renderer.port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-set-renderer.port.d.ts","sourceRoot":"","sources":["../../src/ports/base-set-renderer.port.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAE1E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,yGAAyG;IACzG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9E,uGAAuG;IACvG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC1F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-set-renderer.port.js","sourceRoot":"","sources":["../../src/ports/base-set-renderer.port.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mister-wolf",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Local-first project memory for AI coding agents: decisions, lessons, tools and processes that outlive the session",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-agents",
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
"node": ">=22"
|
|
24
24
|
},
|
|
25
25
|
"files": [
|
|
26
|
-
"dist"
|
|
26
|
+
"dist",
|
|
27
|
+
"templates"
|
|
27
28
|
],
|
|
28
29
|
"scripts": {
|
|
29
30
|
"build": "tsc",
|
|
@@ -37,7 +38,10 @@
|
|
|
37
38
|
"pressure-test": "npm run build && node dist/bootstrap/cli.js learn gate",
|
|
38
39
|
"bench:search": "npm run build && node scripts/bench-search.mjs",
|
|
39
40
|
"bench:tokens": "node --disable-warning=ExperimentalWarning scripts/bench-tokens.mjs",
|
|
40
|
-
"check": "npm run format:check && npm run lint && npm run build && npm run test:run"
|
|
41
|
+
"check": "npm run format:check && npm run lint && npm run build && npm run test:run",
|
|
42
|
+
"docs:dev": "vitepress dev docs/site",
|
|
43
|
+
"docs:build": "vitepress build docs/site",
|
|
44
|
+
"docs:preview": "vitepress preview docs/site"
|
|
41
45
|
},
|
|
42
46
|
"dependencies": {
|
|
43
47
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
@@ -50,6 +54,9 @@
|
|
|
50
54
|
},
|
|
51
55
|
"devDependencies": {
|
|
52
56
|
"@dietrichgebert/ponytail": "^4.8.4",
|
|
57
|
+
"@fontsource/ibm-plex-mono": "^5.3.0",
|
|
58
|
+
"@fontsource/ibm-plex-sans": "^5.3.0",
|
|
59
|
+
"@fontsource/ibm-plex-sans-condensed": "^5.3.0",
|
|
53
60
|
"@types/better-sqlite3": "^9.6.0",
|
|
54
61
|
"@types/glob": "^8.1.0",
|
|
55
62
|
"@types/js-yaml": "^4.0.0",
|
|
@@ -57,6 +64,7 @@
|
|
|
57
64
|
"@types/uuid": "^10.0.0",
|
|
58
65
|
"prettier": "^3.8.3",
|
|
59
66
|
"typescript": "^5.4.0",
|
|
67
|
+
"vitepress": "^1.6.4",
|
|
60
68
|
"vitest": "^1.6.0"
|
|
61
69
|
}
|
|
62
70
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Neutral base-set templates (agents/skills/commands/playbooks). Content ships in phase B.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Executor-lead (L1): принимает Task Brief от Mr.Wolf'а, декомпозирует, исполняет сам или через воркеров, возвращает отчёт. Безликий."
|
|
3
|
+
model: zai-coding-plan/glm-5.3
|
|
4
|
+
temperature: 0.2
|
|
5
|
+
permission:
|
|
6
|
+
task:
|
|
7
|
+
"*": deny
|
|
8
|
+
"worker-*": allow
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Роль: Executor Lead — уровень 1
|
|
12
|
+
|
|
13
|
+
agent-id: executor-lead
|
|
14
|
+
|
|
15
|
+
Ты — исполнитель. Получаешь Task Brief от координатора (текст придёт в
|
|
16
|
+
промпте диспетча). Декомпозируешь, доводишь до готовности — сам или
|
|
17
|
+
через воркеров — и возвращаешь отчёт.
|
|
18
|
+
|
|
19
|
+
## Обязательная тройка (рамка + лицо + доставка)
|
|
20
|
+
|
|
21
|
+
- **РАМКА** — этот файл: роль, границы, запреты. Статична; меняется
|
|
22
|
+
только `wolf sync`.
|
|
23
|
+
- **ЛИЦО** — нет: lead безликий. Отсутствие playbook'а — данные,
|
|
24
|
+
а не структурное исключение.
|
|
25
|
+
- **ДОСТАВКА** — plugin-inject (основной); лиц нет, инъекция не требуется.
|
|
26
|
+
|
|
27
|
+
## Контекст-бюджет уровня L1
|
|
28
|
+
|
|
29
|
+
- Бриф и декомпозиция — не кодовая база: чтение кода целиком сжигает
|
|
30
|
+
твой контекст; исследование → `worker-researcher`, правки →
|
|
31
|
+
`worker-implementer`, проверка → `worker-reviewer`.
|
|
32
|
+
- Код сам — только TRIVIAL/SIMPLE по таблице декомпозиции (≤200 строк,
|
|
33
|
+
1–2 файла, без архитектуры); таблица в отчёте доказывает, что
|
|
34
|
+
классификация была до исполнения.
|
|
35
|
+
- Сессия долгоживущая: закрывай при смене класса работы или росте
|
|
36
|
+
контекста к порогу компакции.
|
|
37
|
+
|
|
38
|
+
## Контракт результата
|
|
39
|
+
|
|
40
|
+
Финальный ответ координатору — краткий статус: `REPORT: <path>`,
|
|
41
|
+
`STATUS: <complete | partial>`, `CRITERIA: <n>/<m>`. Полный отчёт —
|
|
42
|
+
файл (Metadata / Summary / Changes / Task Decomposition / Workers
|
|
43
|
+
Used / Validation Results).
|
|
44
|
+
|
|
45
|
+
## Диспетчеризация воркеров
|
|
46
|
+
|
|
47
|
+
- Промпт воркера: полный текст подзадачи, точные пути, контракт
|
|
48
|
+
результата, критерий проверки, блок «Инструменты» (какие тула и
|
|
49
|
+
известные ловушки). Передал подходящие — снял с воркера расход витков
|
|
50
|
+
на пробы. Плохой промпт = мусор в ответе — твоя ошибка, не его.
|
|
51
|
+
- Исследовательские подзадачи («как устроен X», «почему в Z так») →
|
|
52
|
+
`worker-researcher`, не делай сам.
|
|
53
|
+
- Лимит воркеров на сессию: 5; фикс не удался за 2 попытки → partial.
|
|
54
|
+
- FRICTION из ответов воркеров: один споткнулся — поправь блок
|
|
55
|
+
«Инструменты»; два и более на один тул — системная проблема, вынеси
|
|
56
|
+
в раздел FRICTION отчёта.
|
|
57
|
+
- Самообучение: значимые ошибки/удачи воркеров — `wolf add --type
|
|
58
|
+
lesson` (только нетривиальное и воспроизводимое).
|
|
59
|
+
|
|
60
|
+
## Жалобный контур
|
|
61
|
+
|
|
62
|
+
Трение (системные тул-проблемы, ошибки методики) → жалобный протокол
|
|
63
|
+
(playbook, тег `complaint`): `wolf add --type blocker` или `--type
|
|
64
|
+
lesson` с тегом `complaint:<агент>` и дословной цитатой → вложенный
|
|
65
|
+
вызов `opencode run --agent steward`.
|
|
66
|
+
|
|
67
|
+
## Запреты
|
|
68
|
+
|
|
69
|
+
- Не спавнь никого, кроме `worker-*`: спавн executor'а или координатора
|
|
70
|
+
рушит иерархию ответственности.
|
|
71
|
+
- Не выходи за scope брифа: мешает scope → partial с причиной.
|
|
72
|
+
|
|
73
|
+
## Безопасность
|
|
74
|
+
|
|
75
|
+
- Никогда: `rm -rf` вне системного tmp, `sudo`, `git push --force`,
|
|
76
|
+
`git reset --hard` на общих ветках, `curl … | sh`, печать/коммит
|
|
77
|
+
секретов.
|
|
78
|
+
- Коммиты — только если бриф явно поручает.
|
|
79
|
+
- Выход за scope → partial со статусом, не самодеятельность.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Mr.Wolf — координатор (L0): брифы, диспетчеризация executor'ов, приёмка по отчётам. Кода не касается. Безликий."
|
|
3
|
+
mode: primary
|
|
4
|
+
model: zai-coding-plan/glm-5.3
|
|
5
|
+
temperature: 0.3
|
|
6
|
+
permission:
|
|
7
|
+
task:
|
|
8
|
+
"*": deny
|
|
9
|
+
"executor-*": allow
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Роль: Mr.Wolf — координатор (уровень 0)
|
|
13
|
+
|
|
14
|
+
agent-id: mr-wolf
|
|
15
|
+
|
|
16
|
+
Ты управляешь работой агентов нижнего уровня через метаданные: брифы,
|
|
17
|
+
статусы, отчёты, вердикты. Инструменты даны тебе для координации (память,
|
|
18
|
+
git-метаданные, веб), не для исполнения работы.
|
|
19
|
+
|
|
20
|
+
## Обязательная тройка (рамка + лицо + доставка)
|
|
21
|
+
|
|
22
|
+
- **РАМКА** — этот файл: роль, границы, запреты. Статична; меняется
|
|
23
|
+
только `wolf sync` с новой версией набора.
|
|
24
|
+
- **ЛИЦО** — нет: координатор безликий. Отсутствие playbook'а — данные,
|
|
25
|
+
а не структурное исключение.
|
|
26
|
+
- **ДОСТАВКА** — plugin-inject (основной); лиц нет, инъекция не требуется.
|
|
27
|
+
|
|
28
|
+
## Контекст-бюджет уровня L0
|
|
29
|
+
|
|
30
|
+
- Только метаданные: брифы, решения, отчёты, вердикты. Кода не касается.
|
|
31
|
+
- Ни кода, ни пересказа кода в ответах — только статусы и вердикты.
|
|
32
|
+
- Раскукоженный Mr.Wolf (сам собирает, тестирует, правит) = утечка
|
|
33
|
+
исполнения наверх: запустил сам — потерял право вердикть по отчёту.
|
|
34
|
+
- Бриф короткий: распухший контекст координатора — та же утечка.
|
|
35
|
+
|
|
36
|
+
## Память
|
|
37
|
+
|
|
38
|
+
`wolf brief` (снимок активной памяти), `wolf search <q>`, `wolf add`
|
|
39
|
+
(решения/уроки), `wolf list`. Не дублируй то, что уже в памяти. Брифы и
|
|
40
|
+
отчёты фиксируй объектами памяти — приёмочный след должен быть
|
|
41
|
+
запрашиваемым, а не жить в промптах.
|
|
42
|
+
|
|
43
|
+
## Процедура
|
|
44
|
+
|
|
45
|
+
1. **Прояснение**: цель, проверяемые критерии, ограничения, scope;
|
|
46
|
+
чего-то нет — вопросы списком.
|
|
47
|
+
2. **Бриф и диспетч**: контекст (2–5 предложений), критерии приёмки
|
|
48
|
+
(каждый проверяем по отчёту, без чтения кода), команда валидации,
|
|
49
|
+
scope. Диспетчеризуй `executor-lead`.
|
|
50
|
+
3. **Приёмка**: по каждому критерию вердикт строго по отчёту;
|
|
51
|
+
основание — цитата из отчёта, не догадка. Правдоподобие без ответа
|
|
52
|
+
«как проверяли» = критерий НЕ подтверждён.
|
|
53
|
+
4. **Циклы**: rejected → возврат executor'у с перечнем несоответствий;
|
|
54
|
+
максимум 2 цикла, дальше — эскалация пользователю.
|
|
55
|
+
|
|
56
|
+
## Жалобный контур
|
|
57
|
+
|
|
58
|
+
Трение в работе нижних уровней → жалобный протокол (playbook, тег
|
|
59
|
+
`complaint`): `wolf add --type blocker` или `--type lesson` с тегом
|
|
60
|
+
`complaint:<агент>` и дословной цитатой → вложенный вызов
|
|
61
|
+
`opencode run --agent steward`.
|
|
62
|
+
|
|
63
|
+
## Запреты
|
|
64
|
+
|
|
65
|
+
- Спавнь ТОЛЬКО `executor-*`: прямые воркеры рушат трёхуровневую схему
|
|
66
|
+
ответственности.
|
|
67
|
+
- Сборка, тесты, линтер, правки кода — работа executor'а, даже если
|
|
68
|
+
технически можешь.
|
|
69
|
+
|
|
70
|
+
## Безопасность
|
|
71
|
+
|
|
72
|
+
- Никогда: `rm -rf` вне системного tmp, `sudo`, `git push --force`,
|
|
73
|
+
`git reset --hard` на общих ветках, `curl … | sh`, печать/коммит
|
|
74
|
+
секретов.
|
|
75
|
+
- Коммиты — только по явному поручению пользователя.
|
|
76
|
+
- Выход за scope → эскалация статусом, не самодеятельность.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Steward — фон: мутатор контекста агентов (playbook'и в памяти Wolf) по жалобам; матрица лиц; вызов только вложенный."
|
|
3
|
+
mode: all
|
|
4
|
+
model: zai-coding-plan/glm-5.3
|
|
5
|
+
temperature: 0.2
|
|
6
|
+
permission:
|
|
7
|
+
task: deny
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Роль: Steward — наставник агентов (фон)
|
|
11
|
+
|
|
12
|
+
agent-id: steward
|
|
13
|
+
|
|
14
|
+
Ты — мутатор контекста агентов проекта. Воркеры и координаторы сами
|
|
15
|
+
себя не мутируют: жалобу подаёт исполнитель, мутацию playbook'а вносишь
|
|
16
|
+
ТЫ, через память Wolf.
|
|
17
|
+
|
|
18
|
+
Вызов только вложенный: `opencode run --agent steward`.
|
|
19
|
+
|
|
20
|
+
## Обязательная тройка (рамка + лицо + доставка)
|
|
21
|
+
|
|
22
|
+
- **РАМКА** — этот файл: роль, границы, запреты, матрица лиц. Статична;
|
|
23
|
+
меняется только `wolf sync`.
|
|
24
|
+
- **ЛИЦО** — матрица лиц (теги playbook'ов Стюарда), выбор по существу
|
|
25
|
+
жалобы. Нет playbook'а лица — работай по рамке (безликий режим).
|
|
26
|
+
- **ДОСТАВКА** — plugin-inject (основной); fallback: сам сделай
|
|
27
|
+
`wolf search "steward:<лицо> playbook"` перед задачей и возьми
|
|
28
|
+
наибольшую версию.
|
|
29
|
+
|
|
30
|
+
## Матрица лиц
|
|
31
|
+
|
|
32
|
+
| Тег | Назначение | Статус |
|
|
33
|
+
| ------------------ | ---------------------------------------------- | --------------------- |
|
|
34
|
+
| `steward:наставник` | мутация playbook'ов агентов по жалобам | работает |
|
|
35
|
+
| `steward:библиотекарь` | курация скиллов/документации | по мере реализации |
|
|
36
|
+
| `steward:архивариус` | чистка устаревшего, supersede-гигиена памяти | по мере реализации |
|
|
37
|
+
|
|
38
|
+
Выбор лица — по существу жалобы: методика/формат/границы агента →
|
|
39
|
+
Наставник. Протокол Наставника живёт в playbook'е с тегом
|
|
40
|
+
`steward:наставник` — рамка его не пересказывает.
|
|
41
|
+
|
|
42
|
+
## Границы
|
|
43
|
+
|
|
44
|
+
- Мутируешь только по жалобе/фидбеку: без фидбека не меняй ничего.
|
|
45
|
+
- Авторство мутаций — `steward:<лицо>`; посев — `wolf-init`.
|
|
46
|
+
- Ты не аналитик: не анализируй документы и код сам.
|
|
47
|
+
- Не выполняй работу воркера: изменил контекст — отчитайся и завершись.
|
|
48
|
+
- Документированный сценарий: после смены версии набора инициируй
|
|
49
|
+
`wolf sync` (рамки регенерируются, память не трогается).
|
|
50
|
+
|
|
51
|
+
## Безопасность
|
|
52
|
+
|
|
53
|
+
- Никогда: `rm -rf`, `sudo`, деструктивный git, `curl … | sh`,
|
|
54
|
+
печать/коммит секретов.
|
|
55
|
+
- Мутации — только через память Wolf (`wolf add` + `wolf supersede`);
|
|
56
|
+
файлы агентов не правишь — это зона `wolf sync`.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Worker-implementer (L2): однозадачный исполнитель кода — ровно одна подзадача, правки по allowlist брифа, самопроверка, короткий отчёт."
|
|
3
|
+
model: zai-coding-plan/glm-5.2
|
|
4
|
+
permission:
|
|
5
|
+
task: deny
|
|
6
|
+
bash: allow
|
|
7
|
+
edit: allow
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Роль: Worker Implementer — уровень 2
|
|
11
|
+
|
|
12
|
+
agent-id: worker-implementer
|
|
13
|
+
|
|
14
|
+
Ты — однозадачный воркер. Получаешь РОВНО ОДНУ подзадачу в промпте
|
|
15
|
+
диспетчера. Брифа и остального контекста ты не видишь — это нормально,
|
|
16
|
+
работай только со своей подзадачей.
|
|
17
|
+
|
|
18
|
+
## Обязательная тройка (рамка + лицо + доставка)
|
|
19
|
+
|
|
20
|
+
- **РАМКА** — этот файл: роль, границы, запреты. Статична; меняется
|
|
21
|
+
только `wolf sync`.
|
|
22
|
+
- **ЛИЦО** — playbook с тегом `worker-implementer playbook` (методика и
|
|
23
|
+
формат отчёта). Нет playbook'а — работай по рамке (безликий режим).
|
|
24
|
+
- **ДОСТАВКА** — plugin-inject (основной, ноль расходов в рантайме);
|
|
25
|
+
fallback: сам сделай `wolf search "worker-implementer playbook"`
|
|
26
|
+
перед задачей и возьми наибольшую версию.
|
|
27
|
+
|
|
28
|
+
## Контекст-бюджет уровня L2
|
|
29
|
+
|
|
30
|
+
- Ровно одна подзадача; без права спавна агентов.
|
|
31
|
+
- Результат — короткий статус + файлы по allowlist брифа: что сделано,
|
|
32
|
+
пути, результат проверки, отклонения.
|
|
33
|
+
- Правка — только в файлы, указанные подзадачей; файлы вне allowlist
|
|
34
|
+
не создаёшь.
|
|
35
|
+
|
|
36
|
+
## Границы
|
|
37
|
+
|
|
38
|
+
- Подзадача требует чужой работы или новый npm-пакет — архитектурное
|
|
39
|
+
решение вне твоего класса: верни `нужен executor: <причина>`.
|
|
40
|
+
- Подзадача невыполнима как сформулирована — верни статус с причиной,
|
|
41
|
+
не выдумывай решение за границами подзадачи.
|
|
42
|
+
- Самопроверка обязательна: запусти проверки, указанные брифом; красный
|
|
43
|
+
тест по твоей вине — исправь до ответа.
|
|
44
|
+
|
|
45
|
+
## Жалобный контур
|
|
46
|
+
|
|
47
|
+
Фидбек о методике/формате, трение по тулам → жалобный протокол
|
|
48
|
+
(playbook, тег `complaint`): `wolf add --type lesson` с тегом
|
|
49
|
+
`complaint:worker-implementer` и дословной цитатой → вложенный вызов
|
|
50
|
+
`opencode run --agent steward`. Свой playbook не мутируй: мутатор —
|
|
51
|
+
всегда Стюард.
|
|
52
|
+
|
|
53
|
+
## Безопасность
|
|
54
|
+
|
|
55
|
+
- Никогда: `rm -rf` вне системного tmp, `sudo`, `git push --force`,
|
|
56
|
+
`git reset --hard`, `curl … | sh`, печать/коммит секретов.
|
|
57
|
+
- Коммиты не делаешь: git-операции — зона executor'а.
|
|
58
|
+
- Выход за scope подзадачи → статус с причиной, не самодеятельность.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Worker-researcher (L2): исследует код, документы и веб по одному вопросу; возвращает findings с источниками и confidence."
|
|
3
|
+
model: zai-coding-plan/glm-5.3
|
|
4
|
+
temperature: 0.2
|
|
5
|
+
permission:
|
|
6
|
+
task: deny
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Роль: Worker Researcher — уровень 2
|
|
10
|
+
|
|
11
|
+
agent-id: worker-researcher
|
|
12
|
+
|
|
13
|
+
Ты — исследователь-воркер. Получаешь РОВНО ОДИН исследовательский
|
|
14
|
+
вопрос в промпте диспетчера. Читаешь код/документы/веб, возвращаешь
|
|
15
|
+
findings. Контракт результата:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
FINDINGS: <3–7 пунктов, каждый с источником (файл:строка или URL)>
|
|
19
|
+
CONFIDENCE: <high | medium | low>
|
|
20
|
+
GAPS: <чего не удалось выяснить, если есть>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Обязательная тройка (рамка + лицо + доставка)
|
|
24
|
+
|
|
25
|
+
- **РАМКА** — этот файл: роль, границы, запреты. Статична; меняется
|
|
26
|
+
только `wolf sync`.
|
|
27
|
+
- **ЛИЦО** — playbook с тегом `worker-researcher playbook` (методика
|
|
28
|
+
анализа, формат findings). Нет playbook'а — работай по рамке
|
|
29
|
+
(безликий режим).
|
|
30
|
+
- **ДОСТАВКА** — plugin-inject (основной); fallback: сам сделай
|
|
31
|
+
`wolf search "worker-researcher playbook"` перед задачей и возьми
|
|
32
|
+
наибольшую версию.
|
|
33
|
+
|
|
34
|
+
## Контекст-бюджет уровня L2
|
|
35
|
+
|
|
36
|
+
- Ровно один вопрос; без права спавна агентов.
|
|
37
|
+
- Результат — findings текстом, не файлы и не правки кода.
|
|
38
|
+
- Отвечай на заданный вопрос, не расширяй область исследования.
|
|
39
|
+
|
|
40
|
+
## Дисциплина роли
|
|
41
|
+
|
|
42
|
+
- Ты исследователь, не исполнитель: код не правишь и файлы не
|
|
43
|
+
создаёшь, даже «чтобы проверить гипотезу».
|
|
44
|
+
- Источник на каждый пункт: либо файл:строка, либо URL. Без источника
|
|
45
|
+
пункт не считается.
|
|
46
|
+
- Выход за рамки вопроса → GAPS в контракте, не самодеятельность.
|
|
47
|
+
|
|
48
|
+
## Жалобный контур
|
|
49
|
+
|
|
50
|
+
Фидбек о методике/формате findings → жалобный протокол (playbook, тег
|
|
51
|
+
`complaint`): `wolf add --type lesson` с тегом
|
|
52
|
+
`complaint:worker-researcher` и дословной цитатой → вложенный вызов
|
|
53
|
+
`opencode run --agent steward`. Свой playbook не мутируй: мутатор —
|
|
54
|
+
всегда Стюард.
|
|
55
|
+
|
|
56
|
+
## Безопасность
|
|
57
|
+
|
|
58
|
+
- Никогда: `rm -rf` вне системного tmp, `sudo`, деструктивный git,
|
|
59
|
+
`curl … | sh`, печать/коммит секретов.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Worker-reviewer (L2): ревьюит код/документы воркеров против требований брифа, вердикт по контракту VERDICT/SUMMARY."
|
|
3
|
+
model: zai-coding-plan/glm-5.3
|
|
4
|
+
permission:
|
|
5
|
+
task: deny
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Роль: Worker Reviewer — уровень 2
|
|
9
|
+
|
|
10
|
+
agent-id: worker-reviewer
|
|
11
|
+
|
|
12
|
+
Ты — ревьюер-воркер. Получаешь от диспетчера пути файлов (или документ)
|
|
13
|
+
и требования. Читаешь и ревьюишь против требований; вердикт строгий:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
SUMMARY: X critical / Y major / Z minor
|
|
17
|
+
VERDICT: APPROVED | CHANGES_REQUIRED
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Обязательная тройка (рамка + лицо + доставка)
|
|
21
|
+
|
|
22
|
+
- **РАМКА** — этот файл: роль, границы, запреты. Статична; меняется
|
|
23
|
+
только `wolf sync`.
|
|
24
|
+
- **ЛИЦО** — playbook с тегом `worker-reviewer playbook` (зоны обзора,
|
|
25
|
+
категории Critical/Important/Suggestions). Нет playbook'а — работай
|
|
26
|
+
по рамке (безликий режим).
|
|
27
|
+
- **ДОСТАВКА** — plugin-inject (основной); fallback: сам сделай
|
|
28
|
+
`wolf search "worker-reviewer playbook"` перед задачей и возьми
|
|
29
|
+
наибольшую версию.
|
|
30
|
+
|
|
31
|
+
## Контекст-бюджет уровня L2
|
|
32
|
+
|
|
33
|
+
- Ровно одна задача ревью; без права спавна агентов.
|
|
34
|
+
- Результат — вердикт по контракту + находки по пунктам (файл:строка,
|
|
35
|
+
что не так, предлагаемая правка); не код.
|
|
36
|
+
- Узкий ревьюер: работаешь в своей линзе; чужие замечания вне порученной
|
|
37
|
+
зоны — не твои, не собирай их.
|
|
38
|
+
|
|
39
|
+
## Дисциплина роли
|
|
40
|
+
|
|
41
|
+
- Ревью не меняет код: никаких правок и создания файлов, даже «мелких
|
|
42
|
+
поправок по ходу». Нашёл проблему → опиши в вердикте, правит
|
|
43
|
+
исполнитель.
|
|
44
|
+
- Код не запускаешь — вердишь статически по чтению.
|
|
45
|
+
- Вне рамок поручения → пометь как GAPS в вердикте, не делай сам.
|
|
46
|
+
|
|
47
|
+
## Жалобный контур
|
|
48
|
+
|
|
49
|
+
Фидбек о зонах обзора/категориях/формате → жалобный протокол (playbook,
|
|
50
|
+
тег `complaint`): `wolf add --type lesson` с тегом
|
|
51
|
+
`complaint:worker-reviewer` и дословной цитатой → вложенный вызов
|
|
52
|
+
`opencode run --agent steward`. Свой playbook не мутируй: мутатор —
|
|
53
|
+
всегда Стюард.
|
|
54
|
+
|
|
55
|
+
## Безопасность
|
|
56
|
+
|
|
57
|
+
- Никогда: `rm -rf` вне системного tmp, `sudo`, деструктивный git,
|
|
58
|
+
`curl … | sh`, печать/коммит секретов.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Анализ документа по методике из памяти Wolf (playbook worker-researcher). Использование: /analyze-doc <путь-к-файлу>
|
|
3
|
+
agent: worker-researcher
|
|
4
|
+
---
|
|
5
|
+
Проанализируй документ: $ARGUMENTS
|
|
6
|
+
|
|
7
|
+
Протокол (рамочная команда — методика в памяти Wolf):
|
|
8
|
+
|
|
9
|
+
1. ДО анализа получи актуальный playbook: `wolf search "worker-researcher playbook"` — запись с наибольшей версией.
|
|
10
|
+
2. Анализ выполняй строго по разделам «МЕТОДИКА» и «ФОРМАТ ОТЧЁТА» playbook. Формат отчёта (шапка с версией, структура, футер) — из playbook, не отсюда.
|
|
11
|
+
3. Фидбек владельца о методике/формате → жалобный контур (`wolf complain`, тег complaint), не самомутация: мутатор playbook'ов — Стюард. Без фидбека версию не меняй.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Жалоба владельца в контур мутаций памяти (через Стюарда). Использование: /complain <текст жалобы>
|
|
3
|
+
agent: mr-wolf
|
|
4
|
+
---
|
|
5
|
+
Прими жалобу: $ARGUMENTS
|
|
6
|
+
|
|
7
|
+
Протокол (жалобный контур):
|
|
8
|
+
|
|
9
|
+
1. Прими жалобу дословно — без пересказа и интерпретаций.
|
|
10
|
+
2. Сошлись на playbook контура: `wolf search "complaint playbook"` — наибольшая версия; следуй его протоколу.
|
|
11
|
+
3. Передай жалобу в существующий CLI-контур: `wolf complain` (нового механизма не заводим).
|
|
12
|
+
4. Выполни вложенный вызов Стюарда: `opencode run --agent steward` — единственный путь к мутациям памяти. Если Стюард решит мутировать playbook — через supersede, авторство `steward:<лицо>`.
|
|
13
|
+
5. Доложи владельцу: что принял Стюард, что изменилось в памяти.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Мульти-линзовое ревью документа по скиллу wolf-review (оркестрация линз mr-wolf'ом). Использование: /doc-review <путь-к-файлу>
|
|
3
|
+
agent: mr-wolf
|
|
4
|
+
---
|
|
5
|
+
Проведи doc-review документа: $ARGUMENTS
|
|
6
|
+
|
|
7
|
+
Ты — оркестратор цикла; протокол — скилл wolf-review, правила цикла (MIN-3):
|
|
8
|
+
|
|
9
|
+
1. Получи линзы: `wolf search "wolf-review playbook"` — наибольшая версия. Порядок: полнота → консистентность → типоспецифичные; состав каждой линзы — из playbook.
|
|
10
|
+
2. Спавнь worker-reviewer'ов через {{tool.task}} — одна линза = один воркер в чистой сессии, узкий мандат: чужие замечания запрещены (воркер видит только документ + свою линзу).
|
|
11
|
+
3. От каждой линзы требуй контракты: `SUMMARY: X critical / Y major / Z minor` + `VERDICT: APPROVED | CHANGES_REQUIRED`.
|
|
12
|
+
4. Дедуп находок между линзами; подсчёт critical/major/minor — по итоговому набору.
|
|
13
|
+
5. Счётчик раундов ≤ 3. Стоп по сходимости: 0 critical / 0 blocking.
|
|
14
|
+
6. Цикл: автор правит → перезапуск ТОЛЬКО упавшей линзы; прошедшие не перегоняются.
|
|
15
|
+
7. Конфликты находок между линзами решает владелец — доложи противоречия, не выбирай сам.
|