agent-quality-kit 0.2.2
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/LICENSE +21 -0
- package/README.md +155 -0
- package/kit/docs/ai/agent-harness-playbook.md +596 -0
- package/kit/docs/ai/ai-native-development.md +371 -0
- package/kit/docs/ai/ai-sdlc.md +221 -0
- package/kit/docs/ai/anthropic-ai-native-sdlc-2026-08.md +294 -0
- package/kit/docs/ai/app-owner-strategy.md +921 -0
- package/kit/docs/ai/deep-research-2026-07.md +161 -0
- package/kit/docs/ai/harness-best-practices.md +385 -0
- package/kit/docs/ai/index.md +64 -0
- package/kit/docs/ai/project-baseline.md +261 -0
- package/kit/docs/ai/quality-gates-checklist.md +322 -0
- package/kit/docs/ai/sources-building-with-agents.md +111 -0
- package/kit/docs/ai/stream-2026-08-ai-coding-panel.md +304 -0
- package/kit/docs/ready-made-rules.md +170 -0
- package/kit/gates/README.md +231 -0
- package/kit/gates/_skip.sh +75 -0
- package/kit/gates/commit-explains-itself/README.md +45 -0
- package/kit/gates/commit-explains-itself/check.sh +63 -0
- package/kit/gates/commit-explains-itself/gate.yml +10 -0
- package/kit/gates/commit-explains-itself/green/COMMIT_MSG +6 -0
- package/kit/gates/commit-explains-itself/red/COMMIT_MSG +3 -0
- package/kit/gates/complexity-limit/README.md +37 -0
- package/kit/gates/complexity-limit/check.sh +44 -0
- package/kit/gates/complexity-limit/gate.yml +13 -0
- package/kit/gates/complexity-limit/green/flat.py +10 -0
- package/kit/gates/complexity-limit/red/deep.py +9 -0
- package/kit/gates/dead-code/README.md +30 -0
- package/kit/gates/dead-code/gate.yml +23 -0
- package/kit/gates/dead-code/green/mod.py +9 -0
- package/kit/gates/dead-code/red/mod.py +9 -0
- package/kit/gates/deps-are-pinned/README.md +29 -0
- package/kit/gates/deps-are-pinned/check.sh +49 -0
- package/kit/gates/deps-are-pinned/gate.yml +9 -0
- package/kit/gates/deps-are-pinned/green/nodep-go/go.mod +3 -0
- package/kit/gates/deps-are-pinned/green/package-lock.json +3 -0
- package/kit/gates/deps-are-pinned/green/package.json +4 -0
- package/kit/gates/deps-are-pinned/green/requirements.txt +2 -0
- package/kit/gates/deps-are-pinned/red/package.json +4 -0
- package/kit/gates/deps-are-pinned/red/requirements.txt +2 -0
- package/kit/gates/deps-are-pinned/red/withdep-go/go.mod +5 -0
- package/kit/gates/duplicate-code/README.md +40 -0
- package/kit/gates/duplicate-code/check.sh +58 -0
- package/kit/gates/duplicate-code/gate.yml +12 -0
- package/kit/gates/duplicate-code/green/common.py +9 -0
- package/kit/gates/duplicate-code/green/use.py +9 -0
- package/kit/gates/duplicate-code/red/a.py +12 -0
- package/kit/gates/duplicate-code/red/b.py +12 -0
- package/kit/gates/entry-links-exist/README.md +22 -0
- package/kit/gates/entry-links-exist/check.sh +24 -0
- package/kit/gates/entry-links-exist/gate.yml +16 -0
- package/kit/gates/entry-links-exist/green/AGENTS.md +5 -0
- package/kit/gates/entry-links-exist/green/rules/general.md +3 -0
- package/kit/gates/entry-links-exist/red/AGENTS.md +3 -0
- package/kit/gates/file-size-limit/README.md +22 -0
- package/kit/gates/file-size-limit/check.sh +34 -0
- package/kit/gates/file-size-limit/gate.yml +9 -0
- package/kit/gates/file-size-limit/green/a.py +251 -0
- package/kit/gates/file-size-limit/green/b.py +251 -0
- package/kit/gates/file-size-limit/red/big.py +601 -0
- package/kit/gates/gate-has-samples/README.md +29 -0
- package/kit/gates/gate-has-samples/check.sh +48 -0
- package/kit/gates/gate-has-samples/gate.yml +9 -0
- package/kit/gates/gate-has-samples/green/.aqk.yml +10 -0
- package/kit/gates/gate-has-samples/green/gates/no-print-in-prod/check.sh +2 -0
- package/kit/gates/gate-has-samples/green/gates/no-print-in-prod/green/good.py +2 -0
- package/kit/gates/gate-has-samples/green/gates/no-print-in-prod/red/bad.py +1 -0
- package/kit/gates/gate-has-samples/red/.aqk.yml +10 -0
- package/kit/gates/gate-has-samples/red/gates/no-print-in-prod/check.sh +2 -0
- package/kit/gates/gates-are-runnable/README.md +23 -0
- package/kit/gates/gates-are-runnable/check.sh +35 -0
- package/kit/gates/gates-are-runnable/gate.yml +9 -0
- package/kit/gates/gates-are-runnable/green/.aqk.yml +9 -0
- package/kit/gates/gates-are-runnable/green/checks/lint.sh +2 -0
- package/kit/gates/gates-are-runnable/red/.aqk.yml +6 -0
- package/kit/gates/gates-run-in-ci/README.md +29 -0
- package/kit/gates/gates-run-in-ci/check.sh +42 -0
- package/kit/gates/gates-run-in-ci/gate.yml +12 -0
- package/kit/gates/gates-run-in-ci/green/.aqk.yml +6 -0
- package/kit/gates/gates-run-in-ci/green/.github/workflows/ci.yml +7 -0
- package/kit/gates/gates-run-in-ci/green/checks/lint.sh +2 -0
- package/kit/gates/gates-run-in-ci/red/.aqk.yml +6 -0
- package/kit/gates/gates-run-in-ci/red/.github/workflows/ci.yml +7 -0
- package/kit/gates/gates-run-in-ci/red/checks/lint.sh +2 -0
- package/kit/gates/lesson-has-outcome/README.md +37 -0
- package/kit/gates/lesson-has-outcome/check.sh +50 -0
- package/kit/gates/lesson-has-outcome/gate.yml +11 -0
- package/kit/gates/lesson-has-outcome/green/.aqk.yml +2 -0
- package/kit/gates/lesson-has-outcome/green/incidents/README.md +32 -0
- package/kit/gates/lesson-has-outcome/red/.aqk.yml +2 -0
- package/kit/gates/lesson-has-outcome/red/incidents/README.md +13 -0
- package/kit/gates/no-print-in-prod/README.md +44 -0
- package/kit/gates/no-print-in-prod/check.sh +36 -0
- package/kit/gates/no-print-in-prod/gate.yml +15 -0
- package/kit/gates/no-print-in-prod/green/docs.ts +15 -0
- package/kit/gates/no-print-in-prod/green/legacy.py +9 -0
- package/kit/gates/no-print-in-prod/green/main.go +8 -0
- package/kit/gates/no-print-in-prod/green/main.rs +4 -0
- package/kit/gates/no-print-in-prod/green/service.py +8 -0
- package/kit/gates/no-print-in-prod/red/main.go +8 -0
- package/kit/gates/no-print-in-prod/red/main.rs +4 -0
- package/kit/gates/no-print-in-prod/red/service.py +3 -0
- package/kit/gates/secrets-not-in-code/README.md +29 -0
- package/kit/gates/secrets-not-in-code/check.sh +18 -0
- package/kit/gates/secrets-not-in-code/gate.yml +9 -0
- package/kit/gates/secrets-not-in-code/green/settings.py +4 -0
- package/kit/gates/secrets-not-in-code/red/settings.py +2 -0
- package/kit/gates/swallowed-error/README.md +26 -0
- package/kit/gates/swallowed-error/check.sh +54 -0
- package/kit/gates/swallowed-error/gate.yml +12 -0
- package/kit/gates/swallowed-error/green/loader.py +11 -0
- package/kit/gates/swallowed-error/green/run.js +8 -0
- package/kit/gates/swallowed-error/red/loader.py +5 -0
- package/kit/gates/swallowed-error/red/run.js +3 -0
- package/kit/gates/todo-without-task/README.md +26 -0
- package/kit/gates/todo-without-task/check.sh +19 -0
- package/kit/gates/todo-without-task/gate.yml +12 -0
- package/kit/gates/todo-without-task/green/order.py +9 -0
- package/kit/gates/todo-without-task/red/order.py +8 -0
- package/kit/ratchet/ratchet.sh +62 -0
- package/kit/rules/general.md +55 -0
- package/kit/rules/security.md +33 -0
- package/kit/rules/testing.md +46 -0
- package/package.json +41 -0
- package/tool/commands/doctor.mjs +230 -0
- package/tool/commands/gates.mjs +445 -0
- package/tool/commands/project.mjs +316 -0
- package/tool/lib/core.mjs +98 -0
- package/tool/lib/manifest.mjs +140 -0
- package/tool/lib/repo.mjs +270 -0
- package/tool/lib/templates.mjs +187 -0
- package/tool/program.mjs +81 -0
- package/tool/selfcheck/conditional.sh +24 -0
- package/tool/selfcheck/gates.sh +127 -0
- package/tool/selfcheck/smoke.sh +539 -0
- package/tool/selfcheck/syntax.sh +23 -0
- package/tool/selfcheck/units.mjs +105 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Разбор «The AI-Native SDLC playbook» (Anthropic, 2026-08-21)
|
|
3
|
+
description: Конспект плейбука Anthropic по перестройке SDLC под агентов и построчная сверка каждой практики с тем, что реально настроено в этом репозитории.
|
|
4
|
+
tags:
|
|
5
|
+
- topic/ai
|
|
6
|
+
- kind/research
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Разбор «The AI-Native SDLC playbook» (Anthropic, 2026-08-21)
|
|
10
|
+
|
|
11
|
+
> **Что это.** Конспект статьи Anthropic Applied AI о перестройке жизненного цикла разработки
|
|
12
|
+
> под агентов — и **сверка каждой практики с нашим репозиторием**: что уже есть, чего нет, что
|
|
13
|
+
> брать, а что не наш случай.
|
|
14
|
+
>
|
|
15
|
+
> **Источник:** блог Anthropic, «The AI-Native SDLC playbook», Louis Claxton, 21.08.2026.
|
|
16
|
+
> Статья описывает практику команды Applied AI у корпоративных клиентов, а не измерение.
|
|
17
|
+
>
|
|
18
|
+
> **Как читать пометки:**
|
|
19
|
+
> 📄 — тезис статьи: **чужая практика, не измерение**. Верификация — на нас.
|
|
20
|
+
> 📏 — проверено на нашем проекте (дата и способ рядом).
|
|
21
|
+
> ⚖️ — место, где практика статьи спорна для нас или упирается в наш контекст.
|
|
22
|
+
>
|
|
23
|
+
> **Чем отличается от соседей по корпусу:** [`ai-sdlc.md`](ai-sdlc.md) — **наш** процесс по
|
|
24
|
+
> этапам · [`agent-harness-playbook.md` §18](agent-harness-playbook.md) — наша ежедневная дисциплина ·
|
|
25
|
+
> [`stream-2026-08-ai-coding-panel.md`](stream-2026-08-ai-coding-panel.md) — срез практики
|
|
26
|
+
> индустрии на август 2026. **Здесь — одна конкретная внешняя методичка и наш ответ на неё.**
|
|
27
|
+
>
|
|
28
|
+
> Дата разбора: **2026-08-26**. Сверка сделана чтением конфигов, а не по памяти.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 0. Главный тезис статьи, и почему он про нас
|
|
33
|
+
|
|
34
|
+
📄 **Код перестал быть узким местом — узкими стали соседние стадии.** Когда сборка сжимается
|
|
35
|
+
до часов, план, ревью и выкат остаются человеческой скорости, и очередь просто переезжает
|
|
36
|
+
влево и вправо от «написать код». Контроли, придуманные под ручное написание («ревьюер читает
|
|
37
|
+
каждую строку»), перестают быть выполнимыми, а не просто становятся медленными.
|
|
38
|
+
|
|
39
|
+
📄 Ответ статьи: каждая стадия **заканчивается артефактом в системе контроля версий**, который
|
|
40
|
+
читает следующая стадия. Цепочка коммитов и есть аудиторский след: кто что попросил, что агент
|
|
41
|
+
произвёл, кто одобрил.
|
|
42
|
+
|
|
43
|
+
📏 **Для нас это не новость — это ровно наша конструкция.** `specs/tasks/<домен>/task-XXX.md` →
|
|
44
|
+
человеческий апрув → тесты → код → ревью → апрув → коммит. Мы пришли к этому раньше и своим
|
|
45
|
+
путём, из собственных инцидентов (см. [`agent-harness-playbook.md` §18](agent-harness-playbook.md)). Ценность статьи не
|
|
46
|
+
в тезисе, а в **двух-трёх местах, где у неё есть звено, которого у нас нет** — они в §7.
|
|
47
|
+
|
|
48
|
+
⚖️ Существенная разница контекста: статья написана для организации с командой людей, ролями и
|
|
49
|
+
регулятором. У нас **один владелец и агенты**. Всё, что в статье решает проблему «согласовать
|
|
50
|
+
между отделами», нам не нужно; всё, что решает проблему «человек не успевает понять, что
|
|
51
|
+
произошло», нужно вдвойне.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 1. Стадия Plan — «intent.md»
|
|
56
|
+
|
|
57
|
+
📄 Идея исходит от того, кто её придумал, а не от того, кто умеет писать требования. Человек
|
|
58
|
+
разговаривает с агентом, тот записывает `intent.md` в терминах автора: проблема, желаемый
|
|
59
|
+
исход, кого затрагивает, ограничения, открытые вопросы. Владелец продукта правит и коммитит.
|
|
60
|
+
Дальше это читает следующая стадия.
|
|
61
|
+
|
|
62
|
+
| Практика | У нас | Чем доказано |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| Намерение как версионируемый артефакт | ⬜ **частично** | есть `specs/tasks/`, но это уже **план**, а не намерение |
|
|
65
|
+
| Автор намерения = не инженер | ✅ есть | владелец формулирует задачу словами, Planner превращает в план |
|
|
66
|
+
| Шаблон намерения как скилл | ⬜ частично | есть скилл `plan-template` — но он про план, не про намерение |
|
|
67
|
+
|
|
68
|
+
⚖️ **Стоит ли нам заводить отдельный `intent.md` — не очевидно.** Аргумент за: у нас регулярно
|
|
69
|
+
теряется «зачем» — план начинается со «что делаем», и через месяц причина восстанавливается по
|
|
70
|
+
переписке. Аргумент против: лишний артефакт на каждую задачу при одном владельце — это налог,
|
|
71
|
+
а не польза; у Planner'а уже есть раздел цели.
|
|
72
|
+
|
|
73
|
+
📏 **Реальный след проблемы у нас есть.** В `docs/rebuild/_archive/2026-08-02-priority-slice.md`
|
|
74
|
+
и в реестре несколько пунктов помечены «план УДАЛЁН по решению владельца, знание протокола
|
|
75
|
+
сохранено здесь» — то есть намерение пережило план и его пришлось спасать вручную в реестр.
|
|
76
|
+
Это ровно тот случай, ради которого статья разводит `intent` и `plan`.
|
|
77
|
+
|
|
78
|
+
**Вывод:** не заводить отдельный файл, но **дописать в шаблон плана обязательную секцию
|
|
79
|
+
«Намерение»** — проблема своими словами + чего человек лишён сегодня. Дёшево, и решает
|
|
80
|
+
наблюдаемую потерю.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 2. Стадия Design — «spec.md»
|
|
85
|
+
|
|
86
|
+
📄 Требования и дизайн схлопываются в одну сессию: агент читает `intent.md`, применяет
|
|
87
|
+
организационные **скиллы** (бренд, безопасность, комплаенс, UX) и выдаёт `spec.md` с явно
|
|
88
|
+
помеченными местами конфликта политик. Владелец продукта рецензирует, но не пишет.
|
|
89
|
+
|
|
90
|
+
| Практика | У нас | Чем доказано |
|
|
91
|
+
|---|---|---|
|
|
92
|
+
| Политики применяются **пока пишется спека**, а не в ревью через недели | ✅ есть | 28 скиллов в `.claude/skills/`, правило CLAUDE.md «скилл грузить ДО ответа по теме» |
|
|
93
|
+
| Отдельный `spec.md` между намерением и планом | ❌ нет | у нас сразу план |
|
|
94
|
+
| Явно помеченные конфликты политик | ⬜ частично | правило «отступление от ADR — вопрос владельцу, а не комментарий в коде» есть, но оно **дисциплинарное** |
|
|
95
|
+
|
|
96
|
+
📏 **Наш след того, что дисциплинарного правила мало.** Инцидент 2026-08-06, записан в
|
|
97
|
+
`.claude/CLAUDE.md`: путь сборки рабочего документа отъехал от ADR-018 D5 (XlsxWriter потоком)
|
|
98
|
+
на `openpyxl`, отступление было **осознано и записано комментарием в докстринге** — владелец
|
|
99
|
+
нашёл его через день, читая доки. Цена отложенная: +435 МБ на 100k строк против +128 КБ.
|
|
100
|
+
Это буквально та ситуация, которую статья предлагает ловить пометкой «areas of concern» в
|
|
101
|
+
спеке, до кода.
|
|
102
|
+
|
|
103
|
+
⚖️ Механический гейт на это владелец делать отказался дважды (2026-08-06 и 2026-08-07):
|
|
104
|
+
«правило дисциплины, а не хук». Значит и `spec.md` как отдельный документ, скорее всего, не
|
|
105
|
+
приживётся. Но **пометка конфликта как обязательное поле плана** — это не гейт, это строка
|
|
106
|
+
шаблона, и она не спорит с решением владельца.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 3. Стадия Build — plan mode, CLAUDE.md, skills, hooks
|
|
111
|
+
|
|
112
|
+
📄 Ничего не реализуется без принятого плана. Институциональное знание становится файлами,
|
|
113
|
+
которые агент читает. Ограничения работают как код, а не как привычка.
|
|
114
|
+
|
|
115
|
+
| Практика статьи | У нас | Чем доказано |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| Plan mode обязательным стартом; план коммитится | ✅ **есть** | железное правило CLAUDE.md «Plan-first», `specs/tasks/<домен>/task-XXX.md`, апрув человека отдельным коммитом |
|
|
118
|
+
| План неизменяем после реализации | ✅ **есть и жёстче статьи** | у нас отдельное правило: реализованный план — запись о случившемся, дописывать можно только «Лог выполнения» |
|
|
119
|
+
| `CLAUDE.md` как контекст новичка | ✅ есть | `.claude/CLAUDE.md` + `@import` карты проекта |
|
|
120
|
+
| Правило «ошибся дважды → в CLAUDE.md» | ✅ есть | каждое правило в CLAUDE.md несёт свой инцидент с датой |
|
|
121
|
+
| «Держать под страницу» | ⚖️ **у нас длиннее** | наш CLAUDE.md существенно больше страницы; мы сознательно платим контекстом за прослеживаемость до инцидента |
|
|
122
|
+
| Skills как институциональное знание | ✅ **есть, и глубже статьи** | 28 скиллов, у доменных — собственный `reference/` корпус (напр. `nextcloud-webdav` L1–L20) |
|
|
123
|
+
| Skills распространяются централизованно | ⛔ не наш случай | плагины и marketplace нужны организации, у нас один репозиторий |
|
|
124
|
+
| Hooks как ограничители во время сборки | ✅ **есть** | 4 типа хуков Claude Code (`block-dangerous-commands`, `require-graph-search`, `auto-format`, уведомления) + 22 гейта в pre-commit |
|
|
125
|
+
| Параллельные сессии в worktree | ⬜ частично | worktree доступен, но наш ограничитель — не число сессий, а RAM WSL2 (одна `pytest` за раз, 6 ГБ) |
|
|
126
|
+
| Субагенты для повторяющихся работ | ✅ есть | 13 агентов в `.claude/agents/` |
|
|
127
|
+
|
|
128
|
+
📄 **Самое сильное место главы — про «толстый AGENTS.md»:** один большой файл правил проигрывает
|
|
129
|
+
оглавлению плюс дереву `docs/` по четырём причинам (контекст дефицитен · «важно всё» = не важно
|
|
130
|
+
ничего · гниёт · непроверяемо). У нас это уже записано в
|
|
131
|
+
[`sources-building-with-agents.md`](sources-building-with-agents.md) со ссылкой на OpenAI.
|
|
132
|
+
|
|
133
|
+
⚖️ **И здесь же наше живое противоречие.** Наш `.claude/CLAUDE.md` растёт именно как толстый
|
|
134
|
+
файл: каждое новое правило приезжает с абзацем обоснования и инцидентом. Прослеживаемость —
|
|
135
|
+
наша сознательная ставка, но она платится контекстом в **каждой** сессии. Это стоит однажды
|
|
136
|
+
измерить, а не решать вкусом.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 4. Стадия Test — feedback loop и непрерывные evals
|
|
141
|
+
|
|
142
|
+
📄 Первая половина главы — «дай агенту способ проверить себя»: одна команда сборки, одна команда
|
|
143
|
+
тестов, измеримая цель, для багфикса — **сначала падающий тест, и хук запрещает агенту править
|
|
144
|
+
тестовые файлы во время починки**.
|
|
145
|
+
|
|
146
|
+
| Практика | У нас | Чем доказано |
|
|
147
|
+
|---|---|---|
|
|
148
|
+
| Одна команда на сборку/тесты/линт | ✅ есть | `make verify` / `make verify-full`, зеркало CI (task-327) |
|
|
149
|
+
| Для бага — сначала падающий тест | ✅ есть | TDD-правило CLAUDE.md, RED от Tester до Builder |
|
|
150
|
+
| Агент не может ослабить проверку, которую чинит | ✅ **есть, и своим способом** | `scripts/test-lock.sh snapshot` перед Builder → `verify` после; расхождение = стоп и разбор |
|
|
151
|
+
| Проверка как условие «готово» | ✅ есть | Live-stack E2E перед сдачей человеку, `.claude/rules/testing.md` |
|
|
152
|
+
| Визуальная петля для UI | ✅ есть | Playwright MCP, живой UI на `:8180` |
|
|
153
|
+
|
|
154
|
+
📄 Вторая половина — **continuous evals**: 20–50 реальных задач с записанным приемлемым исходом,
|
|
155
|
+
прогон в CI **на каждое изменение `CLAUDE.md`, скиллов и хуков**, порог прохождения как условие
|
|
156
|
+
слияния, каждый прод-инцидент становится постоянным eval'ом.
|
|
157
|
+
|
|
158
|
+
**❌ Этого у нас нет — и это главная дельта статьи.**
|
|
159
|
+
|
|
160
|
+
📏 Замер конфигурации 2026-08-26:
|
|
161
|
+
|
|
162
|
+
- в `.gitlab-ci.yml` whitelist «что считается кодом» перечисляет `.claude/hooks/**` и
|
|
163
|
+
`.claude/schemas/**` — их поведение защищает harness-suite;
|
|
164
|
+
- `.claude/skills/**` (28 штук), `.claude/agents/**` (13), `.claude/rules/**` (8) и сам
|
|
165
|
+
`.claude/CLAUDE.md` в whitelist **не входят вовсе** — пуш, лежащий целиком в них, пайплайна
|
|
166
|
+
не создаёт;
|
|
167
|
+
- в `.claude/skills/trigger-evals/` лежат **17 готовых наборов**, а прогонщика к ним нет —
|
|
168
|
+
это открытый пункт §8 реестра;
|
|
169
|
+
- `scripts/` не содержит ни одного eval-скрипта;
|
|
170
|
+
- единственный тест харнеса — `.claude/hooks/tests/test_require_graph_search.sh`, то есть один
|
|
171
|
+
хук из четырёх.
|
|
172
|
+
|
|
173
|
+
**Что это означает практически:** правка описания скилла может молча выключить его загрузку, и
|
|
174
|
+
единственный арбитр этого — «владелец заметит через день, читая доки». Именно так вскрылось
|
|
175
|
+
отступление от ADR-018. И у нас уже есть **зафиксированный каталог** таких молчаливых поломок:
|
|
176
|
+
пункт реестра «три расхождения в скиллах, найденные 2026-08-02» — `celery-tasks` описывает две
|
|
177
|
+
полосы вместо шести, у `fsd-architecture` таблица разрешённых импортов **перевёрнута** и
|
|
178
|
+
противоречит собственной диаграмме, `safe-migrations` предлагает опасный приём. Все три нашлись
|
|
179
|
+
чтением человеком, не проверкой.
|
|
180
|
+
|
|
181
|
+
⚖️ **Цена честно.** Каждый прогон eval-набора — это реальные токены, и делать его на каждый пуш
|
|
182
|
+
при 17 наборах дорого. Плюс правило владельца: «гейт стережёт существующий артефакт» и «собрал
|
|
183
|
+
базовый гейт → СТОП, строй продукт». И у нас открыт P0 «нет бэкапов». Поэтому это **кандидат в
|
|
184
|
+
очередь, а не работа на сегодня** — но кандидат с самой высокой ставкой из всей статьи, потому
|
|
185
|
+
что закрывает целый класс отказов, у которого сегодня арбитра нет вообще.
|
|
186
|
+
|
|
187
|
+
📄 Дешёвый первый шаг, который статья же и подсказывает: гонять eval не на каждый пуш, а
|
|
188
|
+
**на изменение `.claude/**` и по расписанию**. Тогда цена привязана к частоте правок харнеса,
|
|
189
|
+
а не к частоте коммитов.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 5. Стадия Deploy — ревью, хуки-ворота, CI/CD
|
|
194
|
+
|
|
195
|
+
📄 Ревью работает в обе стороны: агент рецензирует чужие PR по записанной политике и сам
|
|
196
|
+
чинит замечания в своих. Политика живёт файлом `REVIEW.md`: какие проходы (баги · безопасность ·
|
|
197
|
+
соответствие спеке и плану), что считается Important, а что придирка, и потолок числа придирок.
|
|
198
|
+
|
|
199
|
+
| Практика | У нас | Чем доказано |
|
|
200
|
+
|---|---|---|
|
|
201
|
+
| Агент в ревью | ✅ есть | агент `reviewer`, команда `/code-review`, `/code-review ultra` |
|
|
202
|
+
| Человеческий гейт после ревью | ✅ **есть и строже статьи** | правило CLAUDE.md: после APPROVED — СТОП, ждать слов владельца; Archivist никогда не запускается автоматически |
|
|
203
|
+
| Разделение обязанностей: писавший код не одобряет | ✅ есть | Builder ≠ Reviewer ≠ Archivist, тесты пишет Tester |
|
|
204
|
+
| **`REVIEW.md` как отдельный файл политики** | ⬜ **частично** | политика есть, но в скилле `review-checklist` — то есть её читает наш агент, но её не читает внешний ревьюер (`/code-review`, боты в PR) |
|
|
205
|
+
| Потолок числа придирок | ❌ нет | severity-уровни есть, лимита на объём — нет |
|
|
206
|
+
| Находки ревью возвращаются в CLAUDE.md | ✅ есть | правило «повторный баг одного класса → новый гейт», Analyzer/Evolver в пайплайне |
|
|
207
|
+
|
|
208
|
+
📄 **Хуки как ворота согласования** (не как ограничители): хук может не блокировать, а *спросить*,
|
|
209
|
+
приостановив действие до одобрения конкретного человека. Не-отключаемые хуки живут в managed
|
|
210
|
+
settings, которые инженер не может выключить.
|
|
211
|
+
|
|
212
|
+
| Практика | У нас |
|
|
213
|
+
|---|---|
|
|
214
|
+
| Хук-ворота на опасное действие | ✅ есть — `block-dangerous-commands.sh` |
|
|
215
|
+
| Хук-ворота на выкат в прод | ⬜ иначе: у нас ручная кнопка `deploy:production` в GitLab, а не хук |
|
|
216
|
+
| Managed settings, которые нельзя отключить | ⛔ **не наш случай** — одна машина, один владелец; защищать не от кого |
|
|
217
|
+
| Sandbox с сетевым allowlist, запрет чтения `~/.ssh`/`~/.aws` | ⚖️ **стоит перечитать** — единственный кусок «корпоративного» блока, который применим и соло: он защищает не от инженера, а от **угнанного агента** (см. `deep-research-2026-07.md` §1.2, CVE-2025-66032) |
|
|
218
|
+
|
|
219
|
+
📄 CI/CD: агент работает non-interactive внутри пайплайна на местах, где нужно суждение
|
|
220
|
+
(разбор упавшей сборки, флейки, черновик changelog), деплой выражается инструментами MCP с
|
|
221
|
+
правами по окружению, **откат — самый отрепетированный путь в пайплайне**.
|
|
222
|
+
|
|
223
|
+
📏 У нас откат отрепетирован **наполовину**: возврат на предыдущий образ — основной способ
|
|
224
|
+
быстро чиниться, и он прямо назван в реестре причиной, почему `DROP TABLE` разводится на два
|
|
225
|
+
выката (expand and contract). Но **восстановление данных не отрепетировано вовсе** — бэкапов
|
|
226
|
+
нет, это P0. То есть у нас есть откат кода и нет отката данных.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## 6. Стадия Maintain — замыкание петли
|
|
231
|
+
|
|
232
|
+
📄 Детерминированный скрипт следит за метрикой с устойчивым базисом (правила Western Electric),
|
|
233
|
+
и при выходе за полосу **сам вызывает агента без человека в цепочке**: 1σ — только запись,
|
|
234
|
+
2σ — диагностика только на чтение, 3σ — разрешено действовать, но лишь открыв PR в тот же
|
|
235
|
+
гейт ревью или запустив заранее одобренный runbook. Найденное записывается как `intent.md` и
|
|
236
|
+
входит в тот же конвейер.
|
|
237
|
+
|
|
238
|
+
| Предпосылка | У нас |
|
|
239
|
+
|---|---|
|
|
240
|
+
| Централизованные логи | ✅ есть — Loki + Alloy (task-221) |
|
|
241
|
+
| Метрики и алерты | ✅ есть — Prometheus/Grafana/Alertmanager |
|
|
242
|
+
| **Трекинг прод-ошибок** | ❌ **нет** — P0 в реестре: исключения никто не группирует и не алертит |
|
|
243
|
+
| Достоверные метрики веб-процесса | ❌ **нет** — `WEB_CONCURRENCY=4` без `PROMETHEUS_MULTIPROC_DIR`: `/metrics` отдаёт счётчики случайного процесса, и на этих данных работают два живых алерта |
|
|
244
|
+
| Отрепетированный откат данных | ❌ нет — бэкапов нет |
|
|
245
|
+
|
|
246
|
+
**Вывод по главе честный: замыкать петлю нам нечем и рано.** Автоматический вызов агента по
|
|
247
|
+
аномалии требует приборов, которым можно верить, а у нас прямо сейчас есть
|
|
248
|
+
задокументированный случай прибора, которому верить нельзя. Сначала §1 и §5 реестра, потом эта
|
|
249
|
+
глава.
|
|
250
|
+
|
|
251
|
+
⚖️ Отдельно про «Claude в Slack как первый респондент»: у нас нет команды дежурных, чью работу
|
|
252
|
+
это ускоряет. Не наш случай сегодня.
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 7. Что забрать — по убыванию отношения пользы к цене
|
|
257
|
+
|
|
258
|
+
| # | Что | Цена | Почему именно это |
|
|
259
|
+
|---|---|---|---|
|
|
260
|
+
| 1 | **Секция «Намерение» в шаблоне плана** — проблема словами владельца + чего человек лишён сегодня | строка в скилле `plan-template` | у нас уже был случай, когда план удалили, а намерение пришлось спасать вручную в реестр |
|
|
261
|
+
| 2 | **Обязательное поле «конфликты и отступления» в плане** — где решение спорит с ADR/политикой, названо ДО кода | строка в шаблоне, не гейт | ADR-018 D5: отступление было записано в докстринге и найдено через день; правило дисциплины уже есть, ему не хватает **места в артефакте** |
|
|
262
|
+
| 3 | **`REVIEW.md` в корне** — вынести политику ревью из скилла в файл, который читают и внешние ревьюеры | полдня | сегодня `/code-review` и любой бот не видят нашу политику вовсе |
|
|
263
|
+
| 4 | **Eval-прогонщик по 17 готовым наборам**, запуск на изменение `.claude/**` и по расписанию | ощутимая: токены + день работы | закрывает единственный класс отказов, у которого сегодня арбитра нет; уже есть каталог из трёх молчаливо разошедшихся скиллов |
|
|
264
|
+
| 5 | **Перечитать блок sandbox/credentials** статьи применительно к угнанному агенту, а не к инженеру | час чтения | единственная часть «корпоративного» раздела, применимая соло |
|
|
265
|
+
|
|
266
|
+
**Чего в этом списке нет намеренно:** `intent.md` и `spec.md` отдельными файлами, managed
|
|
267
|
+
settings, marketplace плагинов, Claude в Slack, замыкание петли по полосам. Первые два — налог
|
|
268
|
+
без выигрыша при одном владельце; остальные — либо не наш масштаб, либо требуют приборов,
|
|
269
|
+
которых нет.
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 8. Что статья подтверждает, не добавляя нового
|
|
274
|
+
|
|
275
|
+
Это тоже результат, и его стоит назвать: по **plan-first, неизменяемости принятого плана,
|
|
276
|
+
skills как институциональной памяти, хукам-ограничителям, feedback loop, разделению обязанностей
|
|
277
|
+
в ревью и человеческому гейту перед коммитом** статья описывает ровно то, что у нас уже
|
|
278
|
+
работает — местами мягче нашего. Мы пришли к этому раньше и из собственных инцидентов, а не по
|
|
279
|
+
методичке.
|
|
280
|
+
|
|
281
|
+
⚖️ Осторожность, которую стоит удержать: совпадение с чужой методичкой — **не** доказательство
|
|
282
|
+
правильности. Это два независимых наблюдателя, а не арбитр. Арбитром остаётся то, что у нас
|
|
283
|
+
ловит отказ: гейт, тест, замер.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Связанное
|
|
288
|
+
|
|
289
|
+
- Наш процесс по этапам — [`ai-sdlc.md`](ai-sdlc.md)
|
|
290
|
+
- Наша ежедневная дисциплина — [`agent-harness-playbook.md` §18](agent-harness-playbook.md)
|
|
291
|
+
- Практики с агентами из других источников — [`ai-native-development.md`](ai-native-development.md)
|
|
292
|
+
- Срез практики индустрии 2026-08 — [`stream-2026-08-ai-coding-panel.md`](stream-2026-08-ai-coding-panel.md)
|
|
293
|
+
- Угон агентов через недоверенный контент — [`deep-research-2026-07.md`](deep-research-2026-07.md) §1
|
|
294
|
+
- Очередь работ по харнесу — `../rebuild/10-open-work-register.md` §8
|