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,371 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: AI-native разработка — что из чужого опыта у нас есть, а чего нет
|
|
3
|
+
description: Практики разработки с агентами из двух каналов, сверенные с тем, что уже настроено в этом репозитории: харнес, память в коде, планы, исполняемые спеки, control center, feedback loop.
|
|
4
|
+
tags:
|
|
5
|
+
- topic/ai
|
|
6
|
+
- kind/playbook
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# AI-native разработка — что из чужого опыта у нас есть, а чего нет
|
|
10
|
+
|
|
11
|
+
> **Зачем этот документ отдельно.** Половина обоих каналов — про то, **как писать код с
|
|
12
|
+
> агентами**, а не про продукт с LLM. Это касается нашего харнеса (`.claude/`, гейты, пайплайн
|
|
13
|
+
> агентов), а не методологического контура. Держать это вперемешку с RAG вредно, поэтому
|
|
14
|
+
> вынесено сюда.
|
|
15
|
+
>
|
|
16
|
+
> **Откуда файл.** Собран при сплошном чтении двух каналов по теме RAG (провенанс —
|
|
17
|
+
> `../rag/sources/README.md`), поэтому изначально лежал в
|
|
18
|
+
> `docs/rag/`. Переехал в `docs/ai` 2026-08-26 — по предмету, а не по происхождению.
|
|
19
|
+
>
|
|
20
|
+
> **Формат.** Каждая практика: что это, чем подтверждена, и **есть ли она у нас** — с честной
|
|
21
|
+
> отметкой. Дублировать уже написанное в `docs/ai/agent-harness-playbook.md` я не стал; тут
|
|
22
|
+
> только то, что там отсутствует или сформулировано иначе.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## §1. Сводка: где мы уже впереди, а где отстаём
|
|
27
|
+
|
|
28
|
+
| Практика | У нас | Комментарий |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| Гейты в pre-commit, свой arch-lint | ✅ есть | `scripts/arch-lint.sh`, включая `no_silent_except` |
|
|
31
|
+
| Правила и роли агентов | ✅ есть | `.claude/CLAUDE.md`, `.claude/rules/`, пайплайн Planner→…→Analyzer |
|
|
32
|
+
| Plan-first, план в отдельном коммите | ✅ есть | железное правило, `specs/tasks/task-XXX.md` |
|
|
33
|
+
| Централизованные логи | ✅ есть | Loki + Alloy |
|
|
34
|
+
| Карта проекта в контексте | ✅ есть | `specs/memory/project-map.md` |
|
|
35
|
+
| **Дерево `/docs` вместо одного большого файла правил** | 🔶 частично | у нас `docs/` есть, но не как **граф контекстов с ленивой загрузкой** |
|
|
36
|
+
| **`AICODE-` память прямо в коде** | ❌ нет | дешёвая практика, у нас отсутствует |
|
|
37
|
+
| **Исполняемые BDD-спеки** | ❌ нет | у нас тесты, но не спеки в формате Given-When-Then, привязанные к требованиям |
|
|
38
|
+
| **Feedback loop с журналом экспериментов** | ❌ нет | у нас нет метрики, по которой агент мог бы улучшать сам себя в цикле |
|
|
39
|
+
| **Cross-model review** | ❌ нет | ревью делает один и тот же класс модели |
|
|
40
|
+
| **`agent`-режим приложения** | ❌ нет | приложение не оптимизировано под самопроверку агентом |
|
|
41
|
+
| **Трассировка агентного цикла** | ❌ нет | логи есть, трейсов шагов агента нет |
|
|
42
|
+
| **Бэкапы и error tracking** | ❌ нет | P0 в реестре работ; на фоне «автоматических LLM-взломщиков» это уже не абстракция |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## §2. Харнес: дерево `/docs` вместо одного толстого файла
|
|
47
|
+
|
|
48
|
+
**Что делают.** Не один `AGENTS.MD`, а **ветвистая структура документов в `docs/`** — «граф
|
|
49
|
+
контекстов с ленивой загрузкой», который агент сам поддерживает в порядке. Плюс `AGENTS.MD`
|
|
50
|
+
раскиданы по папкам как локальные уточнения ([разбор](https://t.me/llm_under_hood/755),
|
|
51
|
+
[ещё](https://t.me/llm_under_hood/763)).
|
|
52
|
+
|
|
53
|
+
**Чем подтверждено.** Прямой замер: автор переключился на проект со старым форматом (один
|
|
54
|
+
толстый `AGENTS.MD` + `README` + заглушка), и агент «внезапно начал тупить даже с High
|
|
55
|
+
reasoning». Лечение: скормить выжимку из Engineering Harness → попросить прочитать весь код
|
|
56
|
+
и доки → **десятиминутное интервью голосом** → 20 минут на интеграцию и ручную подчистку →
|
|
57
|
+
качество работы вернулось к норме.
|
|
58
|
+
|
|
59
|
+
**Две неявных фишки структуры**, которых не видно сразу:
|
|
60
|
+
|
|
61
|
+
1. **Перетаскивание фич между проектами.** Фичу документируют в `/docs` исходного проекта, а
|
|
62
|
+
потом в целевом просят «вот фича из другого проекта, адаптируй так, чтобы доки оказались в
|
|
63
|
+
доках, код и конфиги обновились, а `make install && make deploy` выкатили новую конфигурацию».
|
|
64
|
+
2. **Быстрый старт новых проектов.** Просят написать RFC, который заводит такой же пустой
|
|
65
|
+
проект с нуля, — и дальше новый проект поднимается одной командой.
|
|
66
|
+
|
|
67
|
+
> **Наш случай.** У нас `docs/` большой и хорошо структурированный, но он написан **для людей**.
|
|
68
|
+
> Точки входа для агента (что читать первым, куда идти дальше) в нём нет — есть только
|
|
69
|
+
> `project-map.md`, который про код, а не про домен. Это дешёвая правка с заметным эффектом.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## §3. Память агента прямо в коде: `AICODE-`
|
|
74
|
+
|
|
75
|
+
**Что делают** ([разбор](https://t.me/llm_under_hood/590)). Разрешают агенту оставлять
|
|
76
|
+
однострочные комментарии с префиксом, который он же потом легко находит через grep, и
|
|
77
|
+
**обязательно просят искать эти комментарии перед началом работы с файлом**:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
// AICODE-NOTE: сложный разбор OSC-последовательностей — это ядро логики оверлея логина
|
|
81
|
+
// AICODE-TODO: вынести парсинг в отдельную функцию, когда появится второй формат
|
|
82
|
+
// AICODE-ASK: что если последовательность разорвана между сообщениями?
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- `AICODE-NOTE` — заметка для будущей сессии;
|
|
86
|
+
- `AICODE-TODO` — задача себе на потом;
|
|
87
|
+
- `AICODE-ASK` — вопрос человеку; человек отвечает и превращает в `NOTE`.
|
|
88
|
+
|
|
89
|
+
**Зачем.** Долгосрочный слой памяти прямо в коде: агент задаёт вопросы по тексту и оставляет
|
|
90
|
+
себе заметки, не раздувая контекст и не заводя отдельную систему.
|
|
91
|
+
|
|
92
|
+
> **Нам это подходит с одной оговоркой.** У нас в правилах жёсткий запрет на `TODO` в финальном
|
|
93
|
+
> коде (гейт в `arch-lint.sh`). Значит либо `AICODE-TODO` не используем, либо гейт учит
|
|
94
|
+
> различать `TODO` и `AICODE-TODO`. Это решение владельца, не моё — правила `.claude/` вне
|
|
95
|
+
> моего скоупа.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## §4. Планы: implementation plan, RFC, ExecSpec
|
|
100
|
+
|
|
101
|
+
**Базовый процесс**, который у нас уже принят как «plan-first», но с деталями, которых у нас нет
|
|
102
|
+
([разбор](https://t.me/llm_under_hood/582)):
|
|
103
|
+
|
|
104
|
+
1. Ставим задачу и **первым делом просим детальный план реализации — не писать код, а подумать**.
|
|
105
|
+
2. **План — единственный источник правды.** Его просматривают глазами; при необходимости
|
|
106
|
+
отправляют в другую сессию и просят проверить на логические нестыковки.
|
|
107
|
+
3. Только после ревью план идёт на исполнение. Потом его можно выбросить или приложить к PR.
|
|
108
|
+
|
|
109
|
+
**Ключевое преимущество, названное прямо:** «все изменения в одном документе, они пока ещё не
|
|
110
|
+
размазаны по коду».
|
|
111
|
+
|
|
112
|
+
**Запуск нескольких версий одной задачи.** Практика, которую стоит знать: всегда запускают
|
|
113
|
+
2–4 версии, выбирают лучшую, остальные выбрасывают. «Время LLM не жалко. Это Спарта»
|
|
114
|
+
([пост](https://t.me/llm_under_hood/678)). OpenAI даже сделала это штатной фичей (до 4 версий).
|
|
115
|
+
|
|
116
|
+
**Забавная и практичная деталь про слово «план»** ([пост](https://t.me/llm_under_hood/725)):
|
|
117
|
+
после того как OpenAI сделала режим планирования штатным, любое упоминание слова «план»
|
|
118
|
+
переключает агента в режим, **запрещающий редактировать файлы**. Пришлось переименовать:
|
|
119
|
+
|
|
120
|
+
```text
|
|
121
|
+
ExecSpec: продумай, проанализируй и набросай спеку реализации фичи.
|
|
122
|
+
Положи в `drafts/###-objective-description.md`, где номер инкрементируется от `001`.
|
|
123
|
+
Обязательно переформулируй задачу и опиши шаги реализации. Приведи фрагменты кода, если нужно.
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
> **Тот же класс граблей возможен и у нас.** Наш `Skill(plan-template)` и слово «план» в
|
|
127
|
+
> правилах — это то, что может однажды столкнуться с изменившимся поведением инструмента.
|
|
128
|
+
> Держим в голове.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## §5. Исполняемые спеки вместо SDD — самая ценная идея раздела
|
|
133
|
+
|
|
134
|
+
**Проблема, которую формулируют прямо** ([разбор](https://t.me/llm_under_hood/876)):
|
|
135
|
+
|
|
136
|
+
> Spec-Driven Development даёт спеки, которые «потом будут лежать в кодовой базе мёртвым грузом
|
|
137
|
+
> и источником галлюцинаций, ибо **нельзя никак проверить, что код всё ещё соответствует
|
|
138
|
+
> спекам**. То есть у нас не спеки получаются, а просто одноразовые вайб-планы.»
|
|
139
|
+
|
|
140
|
+
**Решение — вернуться к BDD, которому двадцать лет.** Формат `Given-When-Then`, придуманный
|
|
141
|
+
ровно для той же проблемы: как синхронизировать разработчиков, продактов и тестировщиков так,
|
|
142
|
+
чтобы требования не устаревали.
|
|
143
|
+
|
|
144
|
+
Иерархия:
|
|
145
|
+
|
|
146
|
+
```text
|
|
147
|
+
(1) Описание требований
|
|
148
|
+
(2) Набор читаемых сценариев под требования (сгруппированы по требованиям)
|
|
149
|
+
(3) Код, который на лету парсит сценарии и прогоняет тест системы
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Если код нарушает сценарий — падает билд. Если добавили требование — получился обычный TDD.
|
|
153
|
+
Инструменты: [Gherkin](https://cucumber.io/docs/gherkin/), [Cucumber](https://cucumber.io/),
|
|
154
|
+
[JBehave](https://jbehave.org/), [RSpec](https://rspec.info/),
|
|
155
|
+
[Behave](https://behave.readthedocs.io/en/latest/).
|
|
156
|
+
|
|
157
|
+
**Что даёт в эпоху агентов:** «агенты замечательно нарезают высокоуровневые требования в BDD
|
|
158
|
+
сценарии и потом реализуют код. При этом сценарии остаются синхронизированными с требованиями,
|
|
159
|
+
но превращаются в нормальный AI-Native Harness, который агент может запускать **хоть по сто раз
|
|
160
|
+
за сессию**».
|
|
161
|
+
|
|
162
|
+
Автор оговаривается, что сам Gherkin не любит (парсеры становятся источником проблем на росте)
|
|
163
|
+
и предпочитает event-driven спеки; у него **тысяча спеков в секунду на одном ядре**, и «дольше
|
|
164
|
+
секунды гонять все базовые бизнес-тесты — недопустимо»
|
|
165
|
+
([пост](https://t.me/llm_under_hood/918)).
|
|
166
|
+
|
|
167
|
+
> **⚡ Это прямо про нашу боль.** У нас есть `specs/tasks/task-XXX.md` с AC — но AC написаны
|
|
168
|
+
> прозой и проверяются глазами человека на ревью. Ничто не мешает коду разъехаться с AC через
|
|
169
|
+
> три задачи, и мы этого не увидим. Наш инвариант «реализованный план неизменяем» защищает
|
|
170
|
+
> историю, но не соответствие.
|
|
171
|
+
>
|
|
172
|
+
> **Ближайший к нам аналог, который уже работает** — `report-golden` и сверка DirectPG: это
|
|
173
|
+
> и есть исполняемые спеки, только для данных. То есть культура у нас есть, просто не
|
|
174
|
+
> распространена на бизнес-правила.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## §6. Feedback loop и журнал экспериментов — агент улучшает себя по метрике
|
|
179
|
+
|
|
180
|
+
**Протокол**, прописанный в `AGENTS.MD` ([разбор](https://t.me/llm_under_hood/727)):
|
|
181
|
+
|
|
182
|
+
```text
|
|
183
|
+
(1) Запускаем `make eval`, узнаём текущий score, записываем в `experiments/007-experiment.md`
|
|
184
|
+
(2) Анализируем код, просматриваем журнал прошлых экспериментов,
|
|
185
|
+
дописываем в тот же файл план улучшения score
|
|
186
|
+
(3) Реализуем и запускаем `make eval`. Стало лучше → коммитим с описанием
|
|
187
|
+
(4) Стало хуже → откатываем код, НО СОХРАНЯЕМ описание эксперимента,
|
|
188
|
+
чтобы в будущем агент не повторял старых ошибок
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Запускается в цикле:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
PROMPT="запусти следующий эксперимент, который оптимизирует код генерации wav-файла"
|
|
195
|
+
for ((i=0; i<=50; i+=1)); do
|
|
196
|
+
codex exec --sandbox danger-full-access "$PROMPT"
|
|
197
|
+
done
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Насколько это работает — проверено экспериментом, который автор назвал сломом мозга**
|
|
201
|
+
([разбор](https://t.me/llm_under_hood/730), [продолжение](https://t.me/llm_under_hood/731)).
|
|
202
|
+
Дали набор из 235 тестов для движка формул Excel и попросили в цикле «прогони тесты, ужаснись,
|
|
203
|
+
напиши минимальный патч, максимально повышающий точность». Git log получился такой:
|
|
204
|
+
|
|
205
|
+
```text
|
|
206
|
+
0.0% → 4.7% → 12.0% → 34.0% → 44.3% → 48.1% → 52.8% → 78.3% → 82.6%
|
|
207
|
+
→ 84.3% → 87.2% → 89.4% → 95.7% → 98.3% → 100.0%
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Автор ожидал «горы спагетти и захардкоженные ответы на тесты» — а получил обычный код с
|
|
211
|
+
парсером формул, AST, интерпретатором и работой с графом зависимостей. Единственный косяк:
|
|
212
|
+
всё сложил в один файл, пришлось просить разнести.
|
|
213
|
+
|
|
214
|
+
> **Ключевое условие, без которого это не работает: должна быть метрика.** Не «сделай лучше»,
|
|
215
|
+
> а `make eval` → число. У нас такая метрика есть ровно в одном месте — сверка отчётов 1С.
|
|
216
|
+
> И именно там этот приём применим прямо сейчас: «повышай процент сходимости, откатывай, если
|
|
217
|
+
> стало хуже, веди журнал».
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## §7. Control Center — когда проектов больше одного
|
|
222
|
+
|
|
223
|
+
**Паттерн** ([разбор](https://t.me/llm_under_hood/886)). По мере роста код перестаёт помещаться
|
|
224
|
+
в одну репу: появляются сервисы, публичная документация, SDK, аналитика, интеграции. Заводится
|
|
225
|
+
отдельный проект **control center**, в котором почти нет кода, но есть:
|
|
226
|
+
|
|
227
|
+
- в `AGENTS.MD` — список соседних проектов с кратким описанием их ролей;
|
|
228
|
+
- дерево `/docs` с той же архитектурой, что у всех остальных проектов;
|
|
229
|
+
- описание деплойментов в исполняемом виде (у автора — NixOS): «как и в случае со спеками,
|
|
230
|
+
я предпочитаю **исполняемые описания — они никогда не врут**»;
|
|
231
|
+
- набор мелких API и скриптов, помогающих агентам ориентироваться;
|
|
232
|
+
- централизованная аналитика, логирование, телеметрия — единообразно для всех проектов;
|
|
233
|
+
- папка с историческими записями: планы, RFC, история изменений серверов, **анализ
|
|
234
|
+
происшествий**, эксперименты.
|
|
235
|
+
|
|
236
|
+
Причём control center у команды **не один**: для продуктовых задач — своя конфигурация, без
|
|
237
|
+
деплоев, но с доступом к аналитике и продуктовым базам знаний.
|
|
238
|
+
|
|
239
|
+
> **Нам это пока не нужно** — у нас один монорепозиторий. Но два элемента стоит забрать уже
|
|
240
|
+
> сейчас: **исполняемое описание деплоя** (у нас частично есть в compose-файлах, но
|
|
241
|
+
> `docker-compose.prod.bi.yml` подключается руками и в пайплайне не упомянут — это уже
|
|
242
|
+
> записано как долг) и **папка с анализом происшествий**.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## §8. Режим `agent` у приложения
|
|
247
|
+
|
|
248
|
+
Мелкая, но точная идея ([разбор](https://t.me/llm_under_hood/755)). Кроме `dev` и `prod`
|
|
249
|
+
появляется третий режим — **`agent`**, в котором приложение оптимизировано под самопроверку
|
|
250
|
+
агентом:
|
|
251
|
+
|
|
252
|
+
- логов меньше;
|
|
253
|
+
- **любая ошибка роняет приложение целиком** (агенту нужен чёткий сигнал, а не деградация);
|
|
254
|
+
- логин отключён полностью, вместо него — параметр вида `-agent-login "reader@test"`;
|
|
255
|
+
- приложение закрывается сразу после первого запроса (`-single-request`).
|
|
256
|
+
|
|
257
|
+
Смысл: агент одной командой дёргает нужную страницу под нужной ролью и получает чистый ответ
|
|
258
|
+
без мусора в контексте.
|
|
259
|
+
|
|
260
|
+
> **Для нас особенно интересна часть про роль.** У нас проверка прав — слепая зона (записана
|
|
261
|
+
> в карте слепоты). Возможность запустить приложение «как пользователь с ролью X» одной командой
|
|
262
|
+
> — это и удобство для агента, и заготовка под тесты авторизации, которых нам не хватает.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## §9. Cross-model review и mutation testing
|
|
267
|
+
|
|
268
|
+
**Cross-model review** — «обязательное ревью фичи моделью из другого семейства теперь личный
|
|
269
|
+
стандарт, без которого неуютно. Не потому что не доверяю своему агенту, а потому что **чужой
|
|
270
|
+
глаз ловит ровно то, что мой замылил**» ([разбор](https://t.me/neuraldeep/2245)).
|
|
271
|
+
|
|
272
|
+
Практика подтверждается независимо: кто-то гоняет одного агента ревьюером после другого по
|
|
273
|
+
2–5 итераций, кто-то не пускает код в git, пока его не посмотрели две модели из разных семейств
|
|
274
|
+
([сводка](https://t.me/neuraldeep/2248)).
|
|
275
|
+
|
|
276
|
+
Официальный плагин для связки существует:
|
|
277
|
+
[cross-model workflow](https://github.com/shanraisshan/claude-code-best-practice/blob/main/development-workflows/cross-model-workflow/cross-model-workflow.md).
|
|
278
|
+
|
|
279
|
+
**Mutation testing через LLM** — тема, которую стоит знать:
|
|
280
|
+
[LLMorpheus](https://github.com/githubnext/llmorpheus) ·
|
|
281
|
+
[разбор Meta ACH](https://engineering.fb.com/2025/09/30/security/llms-are-the-key-to-mutation-testing-and-better-compliance/).
|
|
282
|
+
|
|
283
|
+
> **У нас есть `scripts/mutation-test.sh`** (advisory-профиль для DirectPG casts) — то есть
|
|
284
|
+
> направление уже нащупано. Чего нет — cross-model review: и Reviewer, и Builder у нас одного
|
|
285
|
+
> семейства. Это дешёвое улучшение с понятным механизмом действия.
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## §10. Спор «харнесы умирают?» — и чем он кончился
|
|
290
|
+
|
|
291
|
+
Полезно как отрезвление против переинжиниринга собственной обвязки
|
|
292
|
+
([наброс](https://t.me/neuraldeep/2123), [итог обсуждения](https://t.me/neuraldeep/2130)).
|
|
293
|
+
|
|
294
|
+
**Тезис:** модели стали умнее обвязок; «вся эта обвязка из миллиона спек превратилась в хрупкие
|
|
295
|
+
лестницы из спичек, которые проще сжечь, чем поддерживать». Критическая масса минимума:
|
|
296
|
+
`context7`, `web_search`, `playwright`, базовый `AGENTS.md`/`CLAUDE.md` — и всё.
|
|
297
|
+
|
|
298
|
+
**Что ответило сообщество** (и с чем автор согласился):
|
|
299
|
+
|
|
300
|
+
- **хайп спадает, технология остаётся** — так было с RAG, агентами, MCP, скиллами;
|
|
301
|
+
- **современный харнес — не про тулинг, а про упакованный процесс**: у одного из участников
|
|
302
|
+
имплементация занимает 15–20% времени, ревью и рефакторинг — **50–60%**. Узкое горлышко —
|
|
303
|
+
не написать код, а проверить;
|
|
304
|
+
- **три категории харнеса**: «экзоскелет, который двигает руками модели» — умирает; **память,
|
|
305
|
+
identity и recall между сессиями** — не умирает; **инструменты (shell, браузер, поиск)** —
|
|
306
|
+
точно не умирают;
|
|
307
|
+
- **простой критерий**: харнес нужен, если экономит время на план, дебаг и присмотр. Если
|
|
308
|
+
ковыряешься в нём больше, чем экономишь, — что-то не так.
|
|
309
|
+
|
|
310
|
+
**Итоговая формулировка:**
|
|
311
|
+
|
|
312
|
+
> Умирает излишняя сложность поверх того, что модели уже умеют. Умирают саб-агенты для ревью,
|
|
313
|
+
> когда хватает второй сессии. Умирают графовые оркестраторы из 50 нод, когда работает один
|
|
314
|
+
> ReAct-цикл. **Не умирает упакованный процесс, память между сессиями и cross-model review
|
|
315
|
+
> на объёмных задачах.**
|
|
316
|
+
>
|
|
317
|
+
> «Чем проще велосипед, тем лучше и надёжнее едет. Но если везёшь 150k строк кода с
|
|
318
|
+
> брейк-ченджами — велосипед не подойдёт, нужен грузовик.»
|
|
319
|
+
|
|
320
|
+
> **Как это читать применительно к нам.** У нас как раз «грузовик»: большой проект, много
|
|
321
|
+
> доменов, требования аудита. Наш харнес не избыточен — он соразмерен. Но критерий «экономит
|
|
322
|
+
> ли конкретный элемент время» стоит применять к каждому новому гейту, который мы хотим добавить.
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## §11. Чем это кончается, если не следить: разбор 1069 коммитов
|
|
327
|
+
|
|
328
|
+
Самый честный пост корпуса ([разбор](https://t.me/neuraldeep/2245)) — автор проанализировал
|
|
329
|
+
git-историю своего же проекта за 90 дней:
|
|
330
|
+
|
|
331
|
+
- **из 1069 коммитов 416 — это `fix`**. Не фича, не рефактор — стабилизация уже выкаченного;
|
|
332
|
+
- **1436 блоков `except Exception`**, из которых только ~10% пробрасывают ошибку дальше;
|
|
333
|
+
остальные глушат её в лог или `return None`. Итог — три недели поиска источника 500-к;
|
|
334
|
+
- **один route-файл на 6305 строк** — «не потому что так задумано, а потому что каждую новую
|
|
335
|
+
фичу дописывали туда же: агенту так ближе по контексту»;
|
|
336
|
+
- **число моделей захардкожено в четырёх местах четырьмя разными значениями** (10/13/14/30),
|
|
337
|
+
потому что нет единого источника правды;
|
|
338
|
+
- **пиковая скорость 44 коммита в день** — «это не человеческий темп ревью».
|
|
339
|
+
|
|
340
|
+
**Диагноз автора** — и он важнее фактуры:
|
|
341
|
+
|
|
342
|
+
> «Долг копится строго там, где я убрал себя из центра. А там, где я держу карту в голове и
|
|
343
|
+
> пропускаю решения через себя, — стабилизируется. **AI SDLC — это усилитель. Он множит и
|
|
344
|
+
> продуктивность, и когнитивный долг с одинаковым КПД.** В центре стоит инженер с картой —
|
|
345
|
+
> множится продукт. В центре пусто — множится техдолг.»
|
|
346
|
+
|
|
347
|
+
И ещё точнее, из более позднего поста ([разбор](https://t.me/neuraldeep/2283)):
|
|
348
|
+
|
|
349
|
+
> «**Тест сверяет реализацию с замыслом, но не может проверить сам замысел.** А в агентной
|
|
350
|
+
> разработке пропускается именно формирование идеи, смысла и замысла, а не написание кода.»
|
|
351
|
+
|
|
352
|
+
> **Это буквально обоснование трёх наших железных правил** — plan-first, «реализованный план
|
|
353
|
+
> неизменяем» и «отступление от ADR — вопрос владельцу». Мы записали их после собственных
|
|
354
|
+
> инцидентов; здесь тот же вывод получен независимо и на другом масштабе.
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## §12. Что я предлагаю забрать себе — по убыванию отношения пользы к цене
|
|
359
|
+
|
|
360
|
+
| # | Практика | Цена | Что даёт |
|
|
361
|
+
|---|---|---|---|
|
|
362
|
+
| 1 | **Точка входа для агента в `docs/`** — короткий индекс «что читать первым, куда идти дальше» | часы | заметный рост качества ответов агента по домену; подтверждено чужим замером |
|
|
363
|
+
| 2 | **`AICODE-NOTE` / `AICODE-ASK`** в коде (без `TODO`, чтобы не спорить с гейтом) | часы | память между сессиями, вопросы агента человеку по месту |
|
|
364
|
+
| 3 | **Cross-model review** для крупных задач | настройка | ловит то, что замылил основной агент |
|
|
365
|
+
| 4 | **Feedback loop по метрике сверки 1С** — журнал экспериментов, откат при ухудшении | дни | единственное место, где у нас уже есть числовая метрика |
|
|
366
|
+
| 5 | **Режим `agent` у приложения** с логином по роли | дни | самопроверка агентом + заготовка под тесты прав |
|
|
367
|
+
| 6 | **Исполняемые спеки (BDD) для бизнес-правил** | недели | AC перестают расходиться с кодом молча |
|
|
368
|
+
| 7 | **Трассировка агентного цикла** (LangFuse или своё) | недели | сегодня мы не видим, что агент делал внутри шага |
|
|
369
|
+
|
|
370
|
+
**Ничего из этого не делать, пока не закрыт P0** (бэкапы, error tracking) — это не улучшение
|
|
371
|
+
разработки, а страховка от потери всего.
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
<!-- источник: audit_project/docs/ai/ai-sdlc.md -->
|
|
2
|
+
# SDLC эпохи агентов — как мы разрабатываем, когда код пишет нейросеть
|
|
3
|
+
|
|
4
|
+
> **Что это.** Наш процесс разработки, спроектированный заново под реальность «агент генерит код,
|
|
5
|
+
> человек владеет пониманием». Не классический SDLC с приклеенным ИИ, а пересборка этапов вокруг
|
|
6
|
+
> одной ставки — **проверяемости**. Дистиллят всего накопленного (плейбук, ADR 006, дип-ресёрч
|
|
7
|
+
> 2026-07, корпус практиков, AIE World's Fair, Karpathy). Инструментальная часть — в
|
|
8
|
+
> `agent-harness-playbook.md`; здесь — САМ ПРОЦЕСС и роли.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 0. Почему классический SDLC ломается
|
|
13
|
+
|
|
14
|
+
Три сдвига, из-за которых нельзя просто «добавить ИИ» в старый процесс:
|
|
15
|
+
|
|
16
|
+
1. **Генерация стала дешёвой, понимание — дорогим.** Раньше узкое место — написать код; ревью
|
|
17
|
+
читало то, что человек и так медленно писал. Теперь код появляется быстрее, чем человек способен
|
|
18
|
+
его осмыслить → если оставить классическое ревью, оно либо станет фикцией, либо остановит поток
|
|
19
|
+
(review debt — очередь изменений, которые «в системе», но которых никто не понял).
|
|
20
|
+
2. **Ревью строк умерло — родилось ревью намерений и гейтов.** Никто не будет читать 10 000 строк.
|
|
21
|
+
Их будут читать машины (линтеры, тесты, LLM-ревьюеры), а человек будет проверять ДРУГОЕ:
|
|
22
|
+
контракт, границы, инварианты, «то ли мы вообще строим».
|
|
23
|
+
3. **Способность = модель × харнес** (Harness-Bench). Качество результата определяется не тем,
|
|
24
|
+
«насколько умна нейросеть», а средой: гейтами, обратной связью, границами. Значит процесс
|
|
25
|
+
строится вокруг среды, а не вокруг надежд на модель.
|
|
26
|
+
|
|
27
|
+
## 1. Главная ставка: проверяемость
|
|
28
|
+
|
|
29
|
+
Формула (Karpathy): *классический софт автоматизирует то, что можно специфицировать; LLM
|
|
30
|
+
автоматизируют то, что можно **верифицировать***. Отсюда центральное правило нашего SDLC:
|
|
31
|
+
|
|
32
|
+
> **Не начинаем строить то, для чего не спроектирована проверка.** Сначала «как мы узнаем, что
|
|
33
|
+
> это работает», потом код. Функция без арбитра — не функция, а надежда.
|
|
34
|
+
|
|
35
|
+
Три инструмента проверяемости — и их пределы (важно не путать):
|
|
36
|
+
|
|
37
|
+
| Инструмент | Что делает | Чего НЕ делает |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| **Метрика** | термометр: показывает «39°» | не говорит, что делать; не лечит |
|
|
40
|
+
| **Тест/гейт** | иммунитет: не пускает известный класс болезни | не ловит то, чего нет в контракте |
|
|
41
|
+
| **Трейс/лог** | история болезни: как дошли до состояния | сам себя не читает |
|
|
42
|
+
|
|
43
|
+
И честное ограничение: **нельзя покрыть тестом то, что не пришло в голову.** Это не тупик, а
|
|
44
|
+
причина, почему в процессе есть отдельные этапы против «не пришло в голову» (см. §7).
|
|
45
|
+
|
|
46
|
+
Практическое следствие ставки: вопрос «код хороший или плохой?» переформулируется. Вложенность 10,
|
|
47
|
+
которую человек не разберёт, а нейросеть разберёт — приемлема **только если** (а) поведение
|
|
48
|
+
зафиксировано внешним тестом, (б) сложность под гейтом (у нас C90 ≤ 10 — как раз чтобы такого не
|
|
49
|
+
было), (в) человек понимает КОНТРАКТ этого куска, даже не понимая каждую строку. Понимание
|
|
50
|
+
переезжает с уровня строк на уровень контрактов — но не исчезает.
|
|
51
|
+
|
|
52
|
+
## 2. Кто участники процесса
|
|
53
|
+
|
|
54
|
+
- **Человек (владелец)** — владеет «зачем», инвариантами, вкусом и финальным риском. Не читает
|
|
55
|
+
каждую строку; читает контракты, диффы спеки, объяснения, трейсы. Его нельзя заменить, потому что
|
|
56
|
+
**понимание не аутсорсится**.
|
|
57
|
+
- **Агент-строитель** — генерит код/доки/тесты внутри жёстких гейтов; обязан объяснять сделанное
|
|
58
|
+
(comprehension-гейт).
|
|
59
|
+
- **Агенты-критики** (свежий контекст / другая модель) — devils-advocate, gap-finder, LLM-ревьюеры:
|
|
60
|
+
атакуют планы и диффы без сикофантии к автору.
|
|
61
|
+
- **Жёсткие гейты** (материал, который нельзя «пропустить»): pre-commit, CI, хуки, тесты, лимиты.
|
|
62
|
+
Единственный участник, который никогда не устаёт и не поддаётся уговорам.
|
|
63
|
+
|
|
64
|
+
## 3. Пайплайн: 11 этапов
|
|
65
|
+
|
|
66
|
+
Сводно (детали ниже):
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
0 Зачем → 1 Спека/контракт → 2 Предсказание → 3 План среза + «го»
|
|
70
|
+
→ 4 Красный e2e-арбитр → 5 Стройка в петле → 6 Ревью-пирамида
|
|
71
|
+
→ 7 Live-проверка «как пользователь» → 8 Мердж/деплой
|
|
72
|
+
→ 9 Эксплуатация (инцидент → гейт) → 10 Еженедельный GC
|
|
73
|
+
(+ 11 Петля обучения человека — идёт сквозь все этапы)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Этап 0. «Зачем» (человек).** Вход: боль/идея. Выход: бизнес-ТЗ простыми словами. Агент помогает
|
|
77
|
+
структурировать, devils-advocate атакует («какое допущение молчаливое?»). Анти-паттерн: начать со
|
|
78
|
+
стека («возьмём Kafka»), а не с проверяемого исхода.
|
|
79
|
+
|
|
80
|
+
**Этап 1. Спека и контракт первыми.** Выход: PRD-секции (назначение · глоссарий · внешнее API ·
|
|
81
|
+
модель данных с max-вниманием — самая дорогая ошибка · sequence flows · внешние зависимости ·
|
|
82
|
+
мониторинги-криты) + **Test Questions** — список проверок словами ДО кода. Контракт (API-схемы,
|
|
83
|
+
форматы) — исполняемая цель, не проза. Анти-паттерн: «допишем спеку по ходу» — агент без спеки
|
|
84
|
+
галлюцинирует требования уверенно.
|
|
85
|
+
|
|
86
|
+
**Этап 2. Письменное предсказание (тренажёр суждения).** Перед срезом человек письменно отвечает:
|
|
87
|
+
«что сломается первым? где узкое место? сколько выдержит?» После — сравнение с фактом. Это
|
|
88
|
+
единственный известный способ наращивать инженерное суждение, не набирая код руками: разрыв
|
|
89
|
+
предсказание↔реальность и есть учёба.
|
|
90
|
+
|
|
91
|
+
**Этап 3. План среза + явное «го».** Вертикальный тонкий срез насквозь (walking skeleton), план в
|
|
92
|
+
`spec/plans/NNN.md`, развилки — варианты + рекомендация. Код не пишется без принятого плана.
|
|
93
|
+
Анти-паттерн: «заодно сделаю ещё» — scope creep агента.
|
|
94
|
+
|
|
95
|
+
**Этап 4. Красный e2e-арбитр — до кода.** Приёмочный тест на ПОВЕДЕНИЕ (через внешний интерфейс:
|
|
96
|
+
HTTP → ответ + состояние БД), сначала красный. Он **залочен от строителя** (test lock — агенты
|
|
97
|
+
переписывают тесты под свой сломанный код: SpecBench, 30% прогонов). Арбитр = определение «готово»,
|
|
98
|
+
не мнение.
|
|
99
|
+
|
|
100
|
+
**Этап 5. Стройка в петле.** Агент строит; каждое изменение проходит сквозь жёсткое: авто-формат
|
|
101
|
+
(хук) → arch-lint/ruff (pre-commit) → stop-gate. Правила петли: новые зависимости — отдельное
|
|
102
|
+
решение с «ок» человека (slopsquatting); недоверенный контент — без секретов и write-прав; большой
|
|
103
|
+
дифф (>~400 строк) — событие: разбить или объяснять частями. Повторный баг → не «постараюсь», а
|
|
104
|
+
новый гейт. Многосессионное — через progress-файл, одна фича = одна сессия.
|
|
105
|
+
|
|
106
|
+
**Этап 6. Ревью-пирамида (вместо чтения 10 000 строк).**
|
|
107
|
+
```
|
|
108
|
+
ЧЕЛОВЕК: контракт, границы, инварианты, «то ли строим»,
|
|
109
|
+
сократический аудит («почему так? что сломает?») ← минуты
|
|
110
|
+
LLM-РЕВЬЮЕРЫ: специализированные (security/perf/quality),
|
|
111
|
+
cross-model или свежая сессия; список «что НЕ флагать» ← автоматом
|
|
112
|
+
МАШИННЫЕ ГЕЙТЫ: тесты, линтеры, лимиты, arch-lint, CI ← секунды, всегда
|
|
113
|
+
```
|
|
114
|
+
Ключевое про LLM-ревьюеров: они — тоже система, и их **меряют**: golden-set диффов с подсаженными
|
|
115
|
+
известными багами → recall / false-positive rate; каждый пропущенный в прод баг становится кейсом
|
|
116
|
+
эвала ревьюера. Ревьюер без эвала — генератор шума. Человек в этой пирамиде делает то, что не может
|
|
117
|
+
никто ниже: сверяет с намерением и несёт риск.
|
|
118
|
+
|
|
119
|
+
**Этап 7. Live-проверка «как пользователь».** Агент сам прогоняет реальный стек (curl по реальному
|
|
120
|
+
порту, не test client) → логи всех сторон → состояние БД → side-effects; человек делает
|
|
121
|
+
sanity-проход глазами, НЕ отлов багов проводки. Мок-тесты структурно слепы на швах (прокси, env,
|
|
122
|
+
рестарты) — этот этап их закрывает.
|
|
123
|
+
|
|
124
|
+
**Этап 8. Мердж/деплой.** Зелёный CI — разрешение на мердж (branch protection), атомарный PR,
|
|
125
|
+
Conventional Commit. «Фиксы дёшевы, ожидание дорого»: flaky — перезапуском, но повторно flaky →
|
|
126
|
+
чинить причину.
|
|
127
|
+
|
|
128
|
+
**Этап 9. Эксплуатация: инцидент — это руда.** Наблюдаемость по golden signals; каждый инцидент →
|
|
129
|
+
(а) record/replay — воспроизвести из трейса, (б) регресс-тест, (в) при повторе класса — новый
|
|
130
|
+
постоянный гейт. Петля «прод-инцидент → eval-кейс → гейт» — главный механизм роста качества.
|
|
131
|
+
|
|
132
|
+
**Этап 10. Еженедельный GC.** Cleanup-сессия агента (мёртвый код, дубли, несогласованные паттерны,
|
|
133
|
+
doc-gardening) — отдельными PR; консолидация правил харнеса (неиспользуемое — прунить). Метрика
|
|
134
|
+
здоровья: **Code Durability** (доля кода, дожившего N недель) и rework rate — не LOC.
|
|
135
|
+
|
|
136
|
+
**Этап 11. Петля обучения человека (сквозная).** Из каждого среза человек забирает: сравнение
|
|
137
|
+
предсказания с фактом · конспект «что понял» своими словами · прочитанные ADR («почему так») ·
|
|
138
|
+
повторение по кривой забывания. Агент обязан объяснять цепочки целиком по запросу — это не
|
|
139
|
+
вежливость, а часть процесса (анти-review-debt).
|
|
140
|
+
|
|
141
|
+
## 4. Классика → AI-эра (что именно трансформировалось)
|
|
142
|
+
|
|
143
|
+
| Этап | Было (человек сам) | Стало | Что гарантирует качество |
|
|
144
|
+
|---|---|---|---|
|
|
145
|
+
| Требования | ТЗ «для людей» | спека, читаемая агентом: глоссарий, контракты, TQ | devils-advocate + человек |
|
|
146
|
+
| Дизайн | опыт архитектора | контракт-first + письменное предсказание | предсказание vs факт |
|
|
147
|
+
| Кодинг | руки, часы | агент, минуты | жёсткие гейты вокруг петли |
|
|
148
|
+
| Ревью | человек читает строки | пирамида: гейты → LLM → человек-инварианты | eval самих ревьюеров |
|
|
149
|
+
| Тесты | «после, если успеем» | красный арбитр ДО кода, залочен | test lock + поведение>реализация |
|
|
150
|
+
| QA | ручные прогоны | агент живёт в live-stack сам | чек-лист швов |
|
|
151
|
+
| Документация | пишется и гниёт | durable-доки + статус в git, doc-gardening | правило «прогресс не в доках» |
|
|
152
|
+
| Рефакторинг | «когда-нибудь» | еженедельный GC + слоп-линтеры | Code Durability |
|
|
153
|
+
| Обучение разработчика | пишет код руками | предсказания, вскрытия инцидентов, сократический аудит | §6 |
|
|
154
|
+
|
|
155
|
+
## 5. Что НЕ изменилось (вечное)
|
|
156
|
+
|
|
157
|
+
Спека дешевле кода; ошибка в модели данных — самая дорогая; границы модулей решают масштабируемость
|
|
158
|
+
команды (теперь — агентов); наблюдаемость закладывается, а не прикручивается; простое надёжнее
|
|
159
|
+
сложного (Люссер: каждый последовательный узел множит ненадёжность); **понимание не аутсорсится**.
|
|
160
|
+
ИИ — множитель: он умножает и порядок, и хаос.
|
|
161
|
+
|
|
162
|
+
## 6. Как расти «джун → сеньор», не печатая код (честный ответ)
|
|
163
|
+
|
|
164
|
+
Вопрос «можно ли стать хирургом по видео» — правильный, но профессия сместилась. Ты растёшь не в
|
|
165
|
+
хирурга, а в **главврача с навыками патологоанатома**: не оперируешь руками, но (а) решаешь, какую
|
|
166
|
+
операцию делать, (б) распознаёшь, когда она идёт не так, (в) вскрываешь каждый инцидент до причины.
|
|
167
|
+
Декларативное знание («знаю что») даёт теория; **процедурное («знаю как») нарабатывается — просто
|
|
168
|
+
процедура теперь другая**:
|
|
169
|
+
|
|
170
|
+
1. **Предсказание → факт → разбор** (этап 2/9) — так тренируется суждение о системах. Это
|
|
171
|
+
процедурный навык, его нельзя посмотреть на YouTube, но можно наработать без клавиатуры.
|
|
172
|
+
2. **Вскрытие инцидентов** — читать трейс/лог/дифф до момента «понял причину», без агента-суфлёра
|
|
173
|
+
сначала, потом сверить с ним.
|
|
174
|
+
3. **Сократический аудит агента** — «почему так, а не иначе? что сломается, если…?» Если агент
|
|
175
|
+
не может объяснить просто — это красный флаг кода, если ты не можешь пересказать — красный флаг
|
|
176
|
+
понимания. Merge только после пересказа.
|
|
177
|
+
4. **Проектирование проверок** — новый критерий сеньорности: не «пишет сложный код», а «умеет
|
|
178
|
+
спроектировать арбитра, которому можно верить». Метрики/тесты/гейты — твоя специализация (50%
|
|
179
|
+
времени по твоей же формуле 30/20/50).
|
|
180
|
+
5. **Теория по кривой забывания** (roadmap.sh → конспект → повторение) — да, но каждый рунг
|
|
181
|
+
немедленно привязывается к живому проекту, иначе декларативное знание испаряется.
|
|
182
|
+
|
|
183
|
+
Ловушка, которой надо бояться: **иллюзия понимания через чтение**. Проверка простая — если не
|
|
184
|
+
можешь предсказать поведение системы до запуска и объяснить инцидент после, понимания нет, сколько
|
|
185
|
+
бы кода ты ни «читал».
|
|
186
|
+
|
|
187
|
+
## 7. Против «не пришло в голову» (замыкание круга)
|
|
188
|
+
|
|
189
|
+
Круг «не покроешь тестом то, что не придумал» размыкается ЧУЖИМИ головами и машинным перебором:
|
|
190
|
+
|
|
191
|
+
- **Чужие перспективы**: devils-advocate/gap-finder свежим контекстом; cross-model ревью; чек-листы
|
|
192
|
+
классов дыр (BenchJack 8 классов, OWASP) — это «то, что пришло в голову другим до тебя».
|
|
193
|
+
- **Property-based тесты** (hypothesis): ты задаёшь свойство («скор детерминирован», «баланс
|
|
194
|
+
необходим, но не достаточен»), машина фантазирует тысячи случаев за тебя.
|
|
195
|
+
- **Фаззинг контракта** (schemathesis): перебор того, что ты не догадался бы послать.
|
|
196
|
+
- **Pre-flight нулевые агенты** (null/random/injection): ловят «дыру в задаче», которую автор не видит.
|
|
197
|
+
- **Инцидент-петля**: то, что всё-таки прорвалось, становится тестом навсегда.
|
|
198
|
+
|
|
199
|
+
Круг не замыкается — он превращается в спираль: каждая итерация покрывает больше.
|
|
200
|
+
|
|
201
|
+
## 8. Self-eval по arXiv — да, но через шлюз (наш протокол)
|
|
202
|
+
|
|
203
|
+
Идея «агент сам читает статьи и эволюционирует» рабочая, но **автовнедрение запрещено** (риски:
|
|
204
|
+
взять ненужное, статья с ошибкой, эффект «100 модных практик = ноль фокуса»). Наш проверенный
|
|
205
|
+
сегодня протокол:
|
|
206
|
+
|
|
207
|
+
1. Периодически (или по событию «застряли/новая фаза») — research-агенты ищут **дельту** против
|
|
208
|
+
уже-внедрённого (им даётся список текущего арсенала, иначе получишь пересказ известного).
|
|
209
|
+
2. Находки → reference-док со статусами (✓ первоисточник прочитан / ◐ вторично) и датой.
|
|
210
|
+
3. Каждой находке — вердикт: **внедрить сейчас** (стережёт существующий артефакт) / **триггер**
|
|
211
|
+
(записать условие в ADR) / **отклонить** (с причиной).
|
|
212
|
+
4. Внедрение — только через обычный пайплайн (план → го → гейты). Никогда «агент прочитал — агент
|
|
213
|
+
применил».
|
|
214
|
+
|
|
215
|
+
Так научное знание становится топливом эволюции харнеса, а не источником хаоса.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
**Связанные документы:** инструменты и конфиги — `agent-harness-playbook.md` · решения по гейтам —
|
|
220
|
+
`spec/decisions/006-quality-gates.md` · продуктовые решения — `reference/memo-decisions.md` ·
|
|
221
|
+
источники — `reference/deep-research-2026-07.md` и остальные `reference/*`.
|