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:
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 байт в каждом,
|
||||
лог через канал — семь строк.
|
||||
|
||||
## 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-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-<line>.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
|
||||
|
||||
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
|
||||
|
||||
Reference in new issue
Block a user