From 3780ae0293f407f7030a0b8d14e45a54fbbd7bed Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Thu, 27 Aug 2026 15:47:41 -0400 Subject: [PATCH] =?UTF-8?q?feat(skills):=20=D0=BB=D0=B8=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=83=D0=BC=D0=B5=D1=81=D1=82=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B0=D1=87=D0=B0=D1=82=D0=B0=20shape-=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=85=D0=BE=D0=B4=D0=BE=D0=BC=20=D0=B4=D0=BE=20=D1=87?= =?UTF-8?q?=D1=82=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=B8=D1=84=D1=84=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - на прогоне #158 (clickstream v2) три линии ревью дали ноль находок на реальной ошибке формы: агрегация ключевого зерна в Python, 57 567 ключей через границу ClickHouse -> Airflow. Линза из одних запахов читает исполнение и не видит решений, а ревью от диффа принимает раскладку исполнителя как оглавление. - Что: - в line-taste.md добавлен блок Shape: набросок ожидаемой формы из одной постановки до открытия диффа, список недиктованных решений, вердикт каждому; набросок и список предъявляются как checks run даже при нуле находок. - правило оценки распространено на shape-находки; указатели в prompt-templates.md называют линзу формой и вкусом. - в lessons.md записана эмпирика прогона #158. - Проверка: - вычитка diff линзой writing-for-agents; боевая — следующий прогон конвейера: shape-артефакты видны в отчете линии уместности. Co-Authored-By: Claude Fable 5 --- .../references/lessons.md | 31 +++++++++++++++++++ .../references/prompt-templates.md | 11 ++++--- .../references/prompts/line-taste.md | 29 ++++++++++++++--- 3 files changed, 61 insertions(+), 10 deletions(-) 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