diff --git a/agents/.agents/skills/claude-subagent-playbook/references/lessons.md b/agents/.agents/skills/claude-subagent-playbook/references/lessons.md index 2d2c762..15a253f 100644 --- a/agents/.agents/skills/claude-subagent-playbook/references/lessons.md +++ b/agents/.agents/skills/claude-subagent-playbook/references/lessons.md @@ -389,3 +389,34 @@ codex-cli 0.146.0 и была неверна. Развели две провер - Цифры: два захода контрольных прогонов, промпт односложный («выполни `pwd`»), `model_reasoning_effort="low"`; отчёт `-o` — 46 байт в каждом, лог через канал — семь строк. + +## 2026-08-27: три линии по нулям на ошибке формы (clickstream v2, #158) + +Прогон DQ-контура: реализация Codex, линия уместности Fable, две слепые +резервные линии. Все три дали ноль находок; ошибку увидел пользователь +одним вопросом «почему DQ на Python, а не SQL». + +- **Находка жила выше диффа.** Агрегация ключевого зерна шла в Python: + 57 567 ключей сессий ехали из ClickHouse в процесс Airflow ради + суммирования. Код опрятный, ни один из двенадцати запахов не задет — + линза, читающая код, пройти мимо была обязана. +- **Промах не был бесплатным.** Та же граница была причиной саги с + памятью: OOM планировщика в 640 МиБ, восемь ресурсных ручек в трех + дагах. Ревью объяснило сагу теснотой коробки — гипотезой из + постановки — и не спросило, почему задача, пишущая три десятка строк + сводки, ест сотни мегабайт. +- **Механизм промаха — порядок чтения.** Ревью от диффа принимает + раскладку исполнителя как оглавление; внутри чужой рамки видно кривое + имя, но не то, что раскладка не та. Фронтирный исполнитель пишет + чистый код вокруг неверных решений: ошибки живут в форме, не в + отделке — то же наблюдение, что в прогоне #18. +- **Лечение — механизм, не правило в прозе** (класс отказа записан + 2026-07-31): в `line-taste.md` добавлен shape-проход шагами до чтения + диффа — набросок ожидаемой формы из одной постановки, список + недиктованных решений, вердикт каждому. Артефакты предъявляются как + checks run даже при нуле находок — слот уже был в + `review-boilerplate.md`. Запрет «не читай дифф первым» не + произносится: его исполняет порядок шагов. +- Проверить следующим прогоном: ловит ли shape-проход ошибку класса + #158 и не сжигает ли ревьюер бюджет до диффа (граница «a few lines + suffice»). diff --git a/agents/.agents/skills/claude-subagent-playbook/references/prompt-templates.md b/agents/.agents/skills/claude-subagent-playbook/references/prompt-templates.md index 4d0bb04..478916d 100644 --- a/agents/.agents/skills/claude-subagent-playbook/references/prompt-templates.md +++ b/agents/.agents/skills/claude-subagent-playbook/references/prompt-templates.md @@ -10,8 +10,9 @@ [prompts/line-code.md](prompts/line-code.md) / [prompts/line-rev.md](prompts/line-rev.md) — файлы линий ревью: линза и префикс ID (две слепые линии / одиночный ревьюер). -- [prompts/line-taste.md](prompts/line-taste.md) — вкусовая линза с базой - запахов Фаулера; подшивается к линии уместности (этап 4 SKILL.md). +- [prompts/line-taste.md](prompts/line-taste.md) — линза формы и вкуса: + shape-проход до чтения диффа, затем база запахов Фаулера; подшивается + к линии уместности (этап 4 SKILL.md). - [prompts/self-review.md](prompts/self-review.md) — саморевью исполнителя (этап 3, resume тем же тредом). - [prompts/triage-header.md](prompts/triage-header.md) — правила триажа @@ -175,9 +176,9 @@ shared code}} Осторожно с именем: `task` — это **линия уместности этапа 4** (префикс `TASK`), а не ревью постановки; ревью постановки — этап 2 с префиксами `SPEC-*` и своими именами файлов (ниже). -Вкусовая линза с базой запахов — `line-taste.md`; она едет с **линией -уместности** (её ведёт модель со вкусом — назначение линий в этапе 4 -SKILL.md), поэтому разрез — выбором файла в `cat`, не пересказом +Линза формы и вкуса — `line-taste.md` (shape-проход до диффа, затем +запахи); она едет с **линией уместности** (её ведёт модель со вкусом — +назначение линий в этапе 4 SKILL.md), поэтому разрез — выбором файла в `cat`, не пересказом границы. Стенд делится между линиями? Явный запрет ломающих команд второй линии — отдельным параметрическим файлом `$D/access-.md`, подшитым после файла линии (правило — этап 4 SKILL.md). diff --git a/agents/.agents/skills/claude-subagent-playbook/references/prompts/line-taste.md b/agents/.agents/skills/claude-subagent-playbook/references/prompts/line-taste.md index b0525bc..fc7eedc 100644 --- a/agents/.agents/skills/claude-subagent-playbook/references/prompts/line-taste.md +++ b/agents/.agents/skills/claude-subagent-playbook/references/prompts/line-taste.md @@ -1,10 +1,29 @@ +## Shape + +A strong implementer's errors live in the shape of the solution, not in +the finish of the code — in the decisions the statement left open. +Clean code hides them, so run the shape pass before opening the first +changed file: + +1. From the statement alone, write the expected shape: which computation + lives where, what crosses each process or storage boundary and + roughly how much, which artifacts must exist. A few lines suffice. +2. Read the changes and list the undictated decisions: placement of + computation, data crossing boundaries, entities introduced, work + added beyond the ask. +3. Give every divergence from your sketch and every undictated decision + a verdict against the repo's own values: fits, or a finding. + Formally correct but substantively wrong is a finding — work out of + proportion to the task, an artifact that does not earn its existence, + a check that passes without proving its own claim. + +The sketch and the decision list are review evidence: report them as +checks run even at zero findings. + ## Taste -Formally correct but substantively wrong is a finding: work out of -proportion to the task, an added artifact that does not earn its -existence, a check that passes without proving its own claim. Grade a -taste finding by the cost of living with the code, not by whether it -breaks a test. +Grade a shape or taste finding by the cost of living with the code, not +by whether it breaks a test. Match the changes against this smell baseline (Fowler, _Refactoring_, ch. 3). Two rules bind it: a documented repo standard overrides the