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 байт в каждом,
|
`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
|
||||||
|
|||||||
Reference in new issue
Block a user