mermaid там, где структура — граф или автомат
Критерий: диаграмма заводится, если структура граф или автомат, а проза вынуждена его пересказывать. Где структура таблица соответствий — чек-лист синка, профили ревью, коды выхода — не заводится: дублировала бы таблицу и разошлась с ней. tasks: жизненный цикл записи по индексам — состояния это где числится строка, файл items/ не двигается ни на одном переходе. session: четыре шага сессии; текст говорил «это зависимость, а не список», но зависимости не показывал — теперь на рёбрах написано, что ломается. sprint.md: исходы задачи в спринте плюс два ребра, где порядок нарушается молча — урожай до sprint close и блокер в обход исходов. task-pipeline: одиннадцать шагов с развилкой «тривиальная» и досрочным исходом «крупнее задачи». promote.md: храповик находка → конвенция → правило → удаление, с обратным ребром; обязательность третьего шага теперь видна как ребро. calibration.md: счётчик retune до drop — таблица вердиктов его выразить не может, автомат может. README: граф вызовов между плагинами; односторонность зависимости pipeline → pm видна сразу. Все девять блоков прогнаны через mermaid-cli. README-схема и автомат калибровки переверстаны после просмотра: subgraph'ы ломали раскладку, self-loop наезжал подписями. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+15
-3
@@ -1033,9 +1033,21 @@ HTML-комментарии, невидимые в отрендеренном ma
|
|||||||
ровно эту ошибку. Исключение одно и оно же сток: триаж.
|
ровно эту ошибку. Исключение одно и оно же сток: триаж.
|
||||||
|
|
||||||
**BBB. Диаграммы в скиллах — `mermaid`.** Граф, описанный прозой, читается как
|
**BBB. Диаграммы в скиллах — `mermaid`.** Граф, описанный прозой, читается как
|
||||||
инструкция и теряет форму; диаграмма показывает её целиком. Четыре штуки: общий
|
инструкция и теряет форму; диаграмма показывает её целиком. В конвейере четыре:
|
||||||
граф прогона, граф профиля `design`, пример графа задач батча, веер финальной
|
общий граф прогона, граф профиля `design`, пример графа задач батча, веер
|
||||||
сверки.
|
финальной сверки.
|
||||||
|
|
||||||
|
**Критерий, где диаграмма уместна: структура — граф или автомат, и проза
|
||||||
|
вынуждена его пересказывать.** По этому критерию диаграммы заведены ещё в шести
|
||||||
|
местах: жизненный цикл записи по индексам (`tasks`), четыре шага сессии с
|
||||||
|
причинами на рёбрах (`session`), исходы задачи в спринте (`sprint.md`), одиннадцать
|
||||||
|
шагов пайплайна с развилкой «тривиальная» (`task-pipeline`), храповик промоута с
|
||||||
|
обратным ребром (`promote.md`), счётчик `retune` до `drop` (`calibration.md`) и
|
||||||
|
граф вызовов между плагинами (`README.md`). Где структура — таблица соответствий
|
||||||
|
(чек-лист синка в `docs`, профили ревью, коды выхода), диаграмма не заводится:
|
||||||
|
она бы дублировала таблицу и разошлась с ней. Все диаграммы прогоняются через
|
||||||
|
`mermaid-cli` перед коммитом — синтаксическая ошибка в блоке не видна при чтении
|
||||||
|
и молча ломает рендер.
|
||||||
|
|
||||||
### Что из этого следует
|
### Что из этого следует
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,36 @@
|
|||||||
Соглашение об именах: имя **плагина** длинное с префиксом `av-dev-`, имена
|
Соглашение об именах: имя **плагина** длинное с префиксом `av-dev-`, имена
|
||||||
**скилов** внутри — короткие. Вызов выходит вида `/av-dev-<плагин>:<скилл>`.
|
**скилов** внутри — короткие. Вызов выходит вида `/av-dev-<плагин>:<скилл>`.
|
||||||
|
|
||||||
|
Кто кого зовёт (стрелка — вызов через пространство имён, не импорт):
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TB
|
||||||
|
subgraph pipe["av-dev-pipeline — исполнение, требует OpenSpec"]
|
||||||
|
direction LR
|
||||||
|
batch["task-batch"] --> tp["task-pipeline"]
|
||||||
|
tp --> rp["review-pipeline<br/>9 агентов-проходов"]
|
||||||
|
batch --> rp
|
||||||
|
end
|
||||||
|
subgraph pm["av-dev-pm — управление продуктом, владеет docs/"]
|
||||||
|
direction LR
|
||||||
|
init["init"] --> tasks["tasks"]
|
||||||
|
canon["canon"] --> tasks
|
||||||
|
session["session"] --> tasks
|
||||||
|
docs["docs"]
|
||||||
|
end
|
||||||
|
opsx["opsx:* — внешний плагин:<br/>explore, propose, apply, archive"]
|
||||||
|
git["av-dev-git: commit"]
|
||||||
|
|
||||||
|
tp --> opsx
|
||||||
|
tp --> git
|
||||||
|
tp --> docs
|
||||||
|
tp --> tasks
|
||||||
|
```
|
||||||
|
|
||||||
|
Зависимость **односторонняя: `av-dev-pipeline` знает про `av-dev-pm`, обратно —
|
||||||
|
нет.** Управление продуктом работает в проекте без конвейера; конвейер без
|
||||||
|
канона деградирует поразрядно и говорит об этом строкой.
|
||||||
|
|
||||||
## Канон документов проекта
|
## Канон документов проекта
|
||||||
|
|
||||||
Все проекты приводятся к одной раскладке — так проще ориентироваться, когда
|
Все проекты приводятся к одной раскладке — так проще ориентироваться, когда
|
||||||
|
|||||||
@@ -23,6 +23,23 @@
|
|||||||
| `retune` уже был дважды подряд | `drop` | удаляем проход |
|
| `retune` уже был дважды подряд | `drop` | удаляем проход |
|
||||||
| находит, но ложных больше трети от всех находок | `retune` | триаж съедает больше, чем экономит проход |
|
| находит, но ложных больше трети от всех находок | `retune` | триаж съедает больше, чем экономит проход |
|
||||||
|
|
||||||
|
Вердикты образуют храповик со счётчиком — его-то таблица и не показывает:
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
state "проход в профиле" as live
|
||||||
|
state "retune №1 — правка charter'а" as r1
|
||||||
|
state "retune №2 — последняя попытка" as r2
|
||||||
|
state "проход удалён" as dead
|
||||||
|
|
||||||
|
[*] --> live: заведён и откалиброван ДО включения
|
||||||
|
live --> r1: 1/3, 0/3 или ложных больше трети
|
||||||
|
r1 --> live: замер keep — счётчик сброшен
|
||||||
|
r1 --> r2: снова не ловит
|
||||||
|
r2 --> live: замер keep — счётчик сброшен
|
||||||
|
r2 --> dead: снова не ловит — это театр
|
||||||
|
```
|
||||||
|
|
||||||
**`retune` не более двух раз подряд.** Проход, не находящий дефект своего класса
|
**`retune` не более двух раз подряд.** Проход, не находящий дефект своего класса
|
||||||
в 2 из 3 прогонов после двух правок промпта, — это театр. Удалять, а не
|
в 2 из 3 прогонов после двух правок промпта, — это театр. Удалять, а не
|
||||||
бесконечно править формулировки: каждая итерация правки промпта стоит дороже,
|
бесконечно править формулировки: каждая итерация правки промпта стоит дороже,
|
||||||
|
|||||||
@@ -11,6 +11,27 @@
|
|||||||
- **правила линтера** — то же с детерминированным оракулом и нулевой ценой
|
- **правила линтера** — то же с детерминированным оракулом и нулевой ценой
|
||||||
внимания.
|
внимания.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
f["находка ревью"]
|
||||||
|
cond{"принята и не специфична<br/>для одного места?"}
|
||||||
|
no["промоуту не подлежит:<br/>место одно — комментарий в коде;<br/>вкусовщина — вон на триаже;<br/>нужен рантайм — в журнал ревью"]
|
||||||
|
conv["конвенция:<br/>проверяемое свойство + какой проход нашёл"]
|
||||||
|
rule["правило линтера, запретитель,<br/>тест-сканер или анализатор"]
|
||||||
|
clean["шаг 3: формулировка удалена из конвенций,<br/>строка — в conventions/README.md"]
|
||||||
|
|
||||||
|
f --> cond
|
||||||
|
cond -->|нет| no
|
||||||
|
cond -->|да| conv
|
||||||
|
conv --> rule
|
||||||
|
rule --> clean
|
||||||
|
rule -->|"ложных чаще, чем ловит (~треть)"| conv
|
||||||
|
```
|
||||||
|
|
||||||
|
Ребро назад — обратное движение (внизу): правило, дающее ложные срабатывания
|
||||||
|
чаще, чем ловит, снимается в прозу. Ребро `rule → clean` **обязательное**: без
|
||||||
|
него первые два шага не окупаются, а именно его и пропускают.
|
||||||
|
|
||||||
## Шаг 1. Находка → конвенция
|
## Шаг 1. Находка → конвенция
|
||||||
|
|
||||||
Условия: находка **принята** при ревью (не отвергнута, не понижена в гипотезу) и
|
Условия: находка **принята** при ревью (не отвергнута, не понижена в гипотезу) и
|
||||||
|
|||||||
@@ -148,6 +148,36 @@ description: Автономно проводит одну задачу чере
|
|||||||
|
|
||||||
## Шаги
|
## Шаги
|
||||||
|
|
||||||
|
Одиннадцать шагов с одной развилкой и одним досрочным исходом:
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
s1["1. Прочитать задачу<br/>критерии приёмки выписать сразу"]
|
||||||
|
triv{"тривиальная?"}
|
||||||
|
big["исход «оказалась крупнее задачи»<br/>объявляется ДО заведения change"]
|
||||||
|
s2["2. opsx:explore — груминг идеи"]
|
||||||
|
s3["3. opsx:propose — change, дельта-спеки, tasks.md"]
|
||||||
|
s4["4. ревью предложения, профиль design"]
|
||||||
|
s5["5. отработать замечания + validate --strict"]
|
||||||
|
s6["6. opsx:apply — код, гейт, поведенческая верификация"]
|
||||||
|
s7["7. ревью кода, профиль по факту изменения"]
|
||||||
|
s8["8. opsx:archive"]
|
||||||
|
s9["9. синк документации — av-dev-pm:docs"]
|
||||||
|
s10["10. коммит работы — av-dev-git:commit"]
|
||||||
|
s11["11. закрыть задачу — av-dev-pm:tasks,<br/>вторым коммитом учёта"]
|
||||||
|
|
||||||
|
s1 --> triv
|
||||||
|
s1 -.-> big
|
||||||
|
triv -->|"нет: идея или мутная постановка"| s2
|
||||||
|
s2 --> s3
|
||||||
|
triv -->|"да: шаги 2 и 4 пропускаются"| s3
|
||||||
|
s3 --> s4 --> s5 --> s6 --> s7 --> s8 --> s9 --> s10 --> s11
|
||||||
|
```
|
||||||
|
|
||||||
|
Два чекпоинта ревью — шаги 4 и 7 — единственные места, где зовётся конвейер;
|
||||||
|
порядок «сперва коммит работы, потом коммит учёта» на схеме тоже ребро, и оно
|
||||||
|
обязательное (шаг 11).
|
||||||
|
|
||||||
### 1. Прочитать задачу
|
### 1. Прочитать задачу
|
||||||
|
|
||||||
Задача задана извне (slug, файл, ссылка, описание) — прочитай её и связанные
|
Задача задана извне (slug, файл, ссылка, описание) — прочитай её и связанные
|
||||||
|
|||||||
@@ -121,6 +121,25 @@ description: Ритуал между спринтами и ведение сам
|
|||||||
4. **Выбор цели и набор спринта.** Цель называет человек, набор собирает агент и
|
4. **Выбор цели и набор спринта.** Цель называет человек, набор собирает агент и
|
||||||
показывает **до старта работ**.
|
показывает **до старта работ**.
|
||||||
|
|
||||||
|
Рёбра подписаны тем, что ломается при их нарушении:
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
check["tasks.py check (+ --fix)<br/>результат — строкой в доклад"]
|
||||||
|
s1["1. Разбор вопросов<br/>пачкой, не больше трёх за раз"]
|
||||||
|
s2["2. Разбор прошедшего спринта<br/>про процесс → docs/review.md"]
|
||||||
|
s3["3. Переоценка задач порциями"]
|
||||||
|
s4["4. Цель называет человек,<br/>набор собирает агент"]
|
||||||
|
sprint["спринт: набор заморожен"]
|
||||||
|
|
||||||
|
check --> s1
|
||||||
|
s1 --> s2
|
||||||
|
s2 --> s3
|
||||||
|
s1 -->|"неотвеченный вопрос → переоценка вслепую"| s3
|
||||||
|
s3 -->|"без переоценки набор берётся из протухшего"| s4
|
||||||
|
s4 --> sprint
|
||||||
|
```
|
||||||
|
|
||||||
Процедура каждого шага, размер и отбор порции, храповик на залежавшихся, формат
|
Процедура каждого шага, размер и отбор порции, храповик на залежавшихся, формат
|
||||||
интерактива и доклад — [references/cadence.md](references/cadence.md).
|
интерактива и доклад — [references/cadence.md](references/cadence.md).
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,36 @@
|
|||||||
«все сделаны»: иначе одна застрявшая задача держит спринт бесконечно. Затем
|
«все сделаны»: иначе одна застрявшая задача держит спринт бесконечно. Затем
|
||||||
`sprint close`.
|
`sprint close`.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
take["sprint take — задача в наборе"]
|
||||||
|
done["сделана<br/>close --implemented"]
|
||||||
|
out["вышла<br/>sprint drop --reason"]
|
||||||
|
epic["переросла в эпик<br/>распознаётся до заведения change"]
|
||||||
|
cancel["отменена решением по ходу<br/>close --reason"]
|
||||||
|
all{"по каждой задаче набора<br/>наступил исход?"}
|
||||||
|
harvest["урожай заводится интейком tasks"]
|
||||||
|
close["sprint close"]
|
||||||
|
dissolve["sprint close --dissolve --reason<br/>недоделанное — в беклог"]
|
||||||
|
|
||||||
|
take --> done
|
||||||
|
take --> out
|
||||||
|
take --> epic
|
||||||
|
take --> cancel
|
||||||
|
done --> all
|
||||||
|
out --> all
|
||||||
|
epic --> all
|
||||||
|
cancel --> all
|
||||||
|
all -->|да| harvest
|
||||||
|
harvest -->|"тег sprint: ставится, пока SPRINT.md не очищен"| close
|
||||||
|
take -->|"продолжать нечем ни одной задачей — блокер"| dissolve
|
||||||
|
done -->|"приёмка не сошлась: reopen --reason"| take
|
||||||
|
```
|
||||||
|
|
||||||
|
Два ребра на схеме — те, где порядок обязателен и нарушается молча: **урожай до
|
||||||
|
`sprint close`** (после команды автотег уже не поставится) и **блокер в обход
|
||||||
|
исходов** (спринт распускается, а не ждёт).
|
||||||
|
|
||||||
**Урожай заводится при закрытии спринта, а не при закрытии задачи.** Это
|
**Урожай заводится при закрытии спринта, а не при закрытии задачи.** Это
|
||||||
обязанность закрывающего: пройти по спискам находок от исполнителей и завести
|
обязанность закрывающего: пройти по спискам находок от исполнителей и завести
|
||||||
недостающее интейком скилла `tasks` — с дедупликацией и картой человеку. Заводимое
|
недостающее интейком скилла `tasks` — с дедупликацией и картой человеку. Заводимое
|
||||||
|
|||||||
@@ -77,6 +77,34 @@ docs/tasks/
|
|||||||
даром: `SPRINT.md` лежит под git, `git log -p docs/tasks/SPRINT.md` отдаёт историю
|
даром: `SPRINT.md` лежит под git, `git log -p docs/tasks/SPRINT.md` отдаёт историю
|
||||||
всех наборов без отдельного журнала.
|
всех наборов без отдельного журнала.
|
||||||
|
|
||||||
|
Куда запись может переехать и какой командой — весь набор переходов:
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
state "BACKLOG.md — что берут" as B
|
||||||
|
state "PLAN.md — подо что берут" as P
|
||||||
|
state "SPRINT.md — набор спринта" as S
|
||||||
|
state "REJECTED.md — ушла без реализации" as R
|
||||||
|
state "записи нет — реализована" as D
|
||||||
|
|
||||||
|
[*] --> B: add
|
||||||
|
[*] --> P: add --type goal
|
||||||
|
B --> P: edit --type goal --section
|
||||||
|
P --> B: edit --type task --section
|
||||||
|
B --> S: sprint take
|
||||||
|
S --> B: sprint drop --reason
|
||||||
|
S --> D: close --implemented
|
||||||
|
B --> R: close --reason
|
||||||
|
S --> R: close --reason
|
||||||
|
D --> B: reopen --reason
|
||||||
|
R --> B: reopen --reason
|
||||||
|
```
|
||||||
|
|
||||||
|
Состояния здесь — **где числится строка**, а не где лежит файл: файл
|
||||||
|
`items/<slug>.md` не двигается ни на одном переходе. Стрелок «руками» на схеме
|
||||||
|
нет намеренно — каждый переход это команда, и другого способа его совершить не
|
||||||
|
существует.
|
||||||
|
|
||||||
## Цели
|
## Цели
|
||||||
|
|
||||||
**Цель — такой же файл в `items/`, тип `[goal]`**, перечисленный в `PLAN.md`:
|
**Цель — такой же файл в `items/`, тип `[goal]`**, перечисленный в `PLAN.md`:
|
||||||
|
|||||||
Reference in New Issue
Block a user