feat(skills): линия уместности начата shape-проходом до чтения диффа

- Зачем:
  - на прогоне #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 <noreply@anthropic.com>
This commit is contained in:
ddadminandClaude Fable 5 committed 2026-08-27 15:47:41 -04:00
1 parent 586f02c30b
commit 3780ae0293
3 files changed
+61 -10

No files matched your search

@@ -389,3 +389,34 @@ codex-cli 0.146.0 и была неверна. Развели две провер
- Цифры: два захода контрольных прогонов, промпт односложный («выполни - Цифры: два захода контрольных прогонов, промпт односложный («выполни
`pwd`»), `model_reasoning_effort="low"`; отчёт `-o` — 46 байт в каждом, `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»).
@@ -10,8 +10,9 @@
[prompts/line-code.md](prompts/line-code.md) / [prompts/line-code.md](prompts/line-code.md) /
[prompts/line-rev.md](prompts/line-rev.md) — файлы линий ревью: линза и [prompts/line-rev.md](prompts/line-rev.md) — файлы линий ревью: линза и
префикс ID (две слепые линии / одиночный ревьюер). префикс ID (две слепые линии / одиночный ревьюер).
- [prompts/line-taste.md](prompts/line-taste.md) — вкусовая линза с базой - [prompts/line-taste.md](prompts/line-taste.md) — линза формы и вкуса:
запахов Фаулера; подшивается к линии уместности (этап 4 SKILL.md). shape-проход до чтения диффа, затем база запахов Фаулера; подшивается
к линии уместности (этап 4 SKILL.md).
- [prompts/self-review.md](prompts/self-review.md) — саморевью - [prompts/self-review.md](prompts/self-review.md) — саморевью
исполнителя (этап 3, resume тем же тредом). исполнителя (этап 3, resume тем же тредом).
- [prompts/triage-header.md](prompts/triage-header.md) — правила триажа - [prompts/triage-header.md](prompts/triage-header.md) — правила триажа
@@ -175,9 +176,9 @@ shared code}}
Осторожно с именем: `task` — это **линия уместности этапа 4** (префикс Осторожно с именем: `task` — это **линия уместности этапа 4** (префикс
`TASK`), а не ревью постановки; ревью постановки — этап 2 с префиксами `TASK`), а не ревью постановки; ревью постановки — этап 2 с префиксами
`SPEC-*` и своими именами файлов (ниже). `SPEC-*` и своими именами файлов (ниже).
Вкусовая линза с базой запахов — `line-taste.md`; она едет с **линией Линза формы и вкуса — `line-taste.md` (shape-проход до диффа, затем
уместности** (её ведёт модель со вкусом — назначение линий в этапе 4 запахи); она едет с **линией уместности** (её ведёт модель со вкусом —
SKILL.md), поэтому разрез — выбором файла в `cat`, не пересказом назначение линий в этапе 4 SKILL.md), поэтому разрез — выбором файла в `cat`, не пересказом
границы. Стенд делится между линиями? Явный запрет ломающих команд границы. Стенд делится между линиями? Явный запрет ломающих команд
второй линии — отдельным параметрическим файлом `$D/access-<line>.md`, второй линии — отдельным параметрическим файлом `$D/access-<line>.md`,
подшитым после файла линии (правило — этап 4 SKILL.md). подшитым после файла линии (правило — этап 4 SKILL.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 ## Taste
Formally correct but substantively wrong is a finding: work out of Grade a shape or taste finding by the cost of living with the code, not
proportion to the task, an added artifact that does not earn its by whether it breaks a test.
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.
Match the changes against this smell baseline (Fowler, _Refactoring_, Match the changes against this smell baseline (Fowler, _Refactoring_,
ch. 3). Two rules bind it: a documented repo standard overrides the ch. 3). Two rules bind it: a documented repo standard overrides the