секции PLAN.md: «линия» и «кусты» стали «порядком» и «темами»
Метафора требовала расшифровки при каждом употреблении, и в текстах она и расшифровывалась: «звено упорядоченной линии продукта», «тематический куст — цель, в последовательность не встающая». Если название приходится объяснять рядом с каждым употреблением, объясняет не название. Новые имена называют ровно то свойство, которым секции различаются: в первой очередь значима и обоснована прозой, во второй порядка нет вовсе. Заголовки строчные, как ядро/инфра в беклоге: имя секции одновременно значение для --section, и проза приведена к тому же виду, чтобы «--section Порядок» не выглядело правильным написанием. Версия канона не меняется: canon.md называет файл PLAN.md и о его секциях не говорит — их дом заголовки ## индекса, умолчание живёт в tasks.py. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+35
-4
@@ -134,12 +134,12 @@ jellybit это уже подтвердила на 43 изменениях.
|
|||||||
а настоящее ADR-рассуждение (отказ от DuckDB) лежит в разделе «Открытые
|
а настоящее ADR-рассуждение (отказ от DuckDB) лежит в разделе «Открытые
|
||||||
вопросы» файла `architecture.md`, потому что больше некуда.
|
вопросы» файла `architecture.md`, потому что больше некуда.
|
||||||
- **Два плана.** `docs/plan.md` healthlog («порядок и его обоснование», 11 шагов)
|
- **Два плана.** `docs/plan.md` healthlog («порядок и его обоснование», 11 шагов)
|
||||||
и `<tasks>/PLAN.md` из `av-dev-tasks` («линия целей с обоснованием порядка
|
и `<tasks>/PLAN.md` из `av-dev-tasks` («цели с обоснованием очереди прозой»)
|
||||||
прозой») — один артефакт под двумя именами.
|
— один артефакт под двумя именами.
|
||||||
- **Дубли спек у jellybit.** Из шести файлов `docs/specs/` три (`recognition`,
|
- **Дубли спек у jellybit.** Из шести файлов `docs/specs/` три (`recognition`,
|
||||||
`review-ux`, `workflow`) описывают поведение, уже покрытое capability в
|
`review-ux`, `workflow`) описывают поведение, уже покрытое capability в
|
||||||
`openspec/specs/`.
|
`openspec/specs/`.
|
||||||
- **`docs/drafts/` раскладывается без остатка:** `roadmap.md` → линия целей,
|
- **`docs/drafts/` раскладывается без остатка:** `roadmap.md` → цели в «порядок»,
|
||||||
`conventions-backlog.md` → задачи `[idea]`, `logical-title-model.md` (293
|
`conventions-backlog.md` → задачи `[idea]`, `logical-title-model.md` (293
|
||||||
строки, итог «сущность `title` не вводим») → намеренный отказ, то есть ADR.
|
строки, итог «сущность `title` не вводим») → намеренный отказ, то есть ADR.
|
||||||
|
|
||||||
@@ -156,7 +156,7 @@ jellybit это уже подтвердила на 43 изменениях.
|
|||||||
порядок больше. Чинить надо не дом, а индекс и критерий промоута.
|
порядок больше. Чинить надо не дом, а индекс и критерий промоута.
|
||||||
|
|
||||||
**E. `docs/plan.md` растворяется в `<tasks>/PLAN.md`.** Файл удаляется, 11 шагов
|
**E. `docs/plan.md` растворяется в `<tasks>/PLAN.md`.** Файл удаляется, 11 шагов
|
||||||
становятся линией целей, ссылки в `CLAUDE.md` и паспорте переводятся.
|
становятся целями в «порядке», ссылки в `CLAUDE.md` и паспорте переводятся.
|
||||||
|
|
||||||
**F. Пути жёсткие, оба проекта приводятся к одному виду.** Плагин знает раскладку
|
**F. Пути жёсткие, оба проекта приводятся к одному виду.** Плагин знает раскладку
|
||||||
поимённо; указателя вида `.docs.json` нет.
|
поимённо; указателя вида `.docs.json` нет.
|
||||||
@@ -910,3 +910,34 @@ HTML-комментарии, невидимые в отрендеренном ma
|
|||||||
53. **Запись в журнал версий канона проверка не заменяет.** Она видит, что копия
|
53. **Запись в журнал версий канона проверка не заменяет.** Она видит, что копия
|
||||||
отстала, но не видит, что проект уже унёс старую версию к себе. Это остаётся
|
отстала, но не видит, что проект уже унёс старую версию к себе. Это остаётся
|
||||||
на человеке и сказано в обоих домах.
|
на человеке и сказано в обоих домах.
|
||||||
|
|
||||||
|
## 13. Секции `PLAN.md` переименованы (2026-08-03)
|
||||||
|
|
||||||
|
### Что было
|
||||||
|
|
||||||
|
Секции назывались **«линия»** и **«кусты»** — метафора, требующая расшифровки
|
||||||
|
при каждом употреблении. В текстах она и расшифровывалась: «звено упорядоченной
|
||||||
|
линии продукта», «тематический куст — цель, в последовательность не встающая».
|
||||||
|
Если название приходится объяснять рядом с каждым употреблением, объясняет не
|
||||||
|
название.
|
||||||
|
|
||||||
|
### Решено
|
||||||
|
|
||||||
|
**SS. «порядок» и «темы».** Заголовок называет ровно то свойство, которым секции
|
||||||
|
различаются: в первой очередь значима и обоснована прозой, во второй порядка нет
|
||||||
|
вовсе. Расшифровывать нечего — правило написано в самом имени.
|
||||||
|
|
||||||
|
**TT. Записи в журнал версий канона не требуется — канон этих имён не знает.**
|
||||||
|
`canon.md` называет файл `docs/tasks/PLAN.md` и ничего не говорит о его секциях:
|
||||||
|
их дом — заголовки `##` индекса, а умолчание живёт в `tasks.py`. Версия канона
|
||||||
|
поэтому не меняется, и проект вправе называть секции по-своему. Причина названа
|
||||||
|
вслух, потому что соблазн повысить версию «на всякий случай» здесь сильный, а
|
||||||
|
повышение обязало бы каждый проект что-то делать — при том что делать нечего.
|
||||||
|
|
||||||
|
### Что из этого следует
|
||||||
|
|
||||||
|
54. **Умолчание одно и живёт в `DEFAULT_PLAN_SECTIONS`.** Имена секций
|
||||||
|
по-прежнему настраиваются `--plan-sections`, а домом остаются заголовки `##`
|
||||||
|
индекса — переименование не трогает механику, только умолчание и тексты.
|
||||||
|
55. **Метафора — плохое имя для секции индекса.** Секция читается человеком без
|
||||||
|
контекста, часто из вывода `list`, и второго шанса объяснить себя у неё нет.
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ upgrade` идёт по записям снизу вверх от версии п
|
|||||||
3. `docs/specs/` разобрать: поведение — в `openspec/specs/`, обзор — в
|
3. `docs/specs/` разобрать: поведение — в `openspec/specs/`, обзор — в
|
||||||
`docs/architecture.md`, знание о чужих системах — в `docs/research/`.
|
`docs/architecture.md`, знание о чужих системах — в `docs/research/`.
|
||||||
Дубли capability удалить, сверив поимённо.
|
Дубли capability удалить, сверив поимённо.
|
||||||
4. `docs/plan.md` → `docs/tasks/PLAN.md` линией целей.
|
4. `docs/plan.md` → `docs/tasks/PLAN.md`, шаги плана — целями в «порядок».
|
||||||
5. `BRIEF.md` → `docs/passport.md`.
|
5. `BRIEF.md` → `docs/passport.md`.
|
||||||
6. `docs/backlog/` → `docs/tasks/`.
|
6. `docs/backlog/` → `docs/tasks/`.
|
||||||
7. `docs/review-journal.md` или `docs/review/journal.md` → `docs/review.md`,
|
7. `docs/review-journal.md` или `docs/review/journal.md` → `docs/review.md`,
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ description: Завести новый проект — сессия вопро
|
|||||||
проекте нельзя откатить — деплой, выкладка наружу, перезапись данных.
|
проекте нельзя откатить — деплой, выкладка наружу, перезапись данных.
|
||||||
5. **Чем краснеет гейт.** Какие проверки обязательны; что красит безусловно;
|
5. **Чем краснеет гейт.** Какие проверки обязательны; что красит безусловно;
|
||||||
чего в гейте намеренно не будет и кто тогда это гоняет.
|
чего в гейте намеренно не будет и кто тогда это гоняет.
|
||||||
6. **Первые цели.** Направления, а не задачи: три-пять целей линии с
|
6. **Первые цели.** Направления, а не задачи: три-пять целей в «порядок», с
|
||||||
обоснованием порядка прозой.
|
обоснованием очереди прозой.
|
||||||
|
|
||||||
### Как вести
|
### Как вести
|
||||||
|
|
||||||
|
|||||||
@@ -170,7 +170,7 @@
|
|||||||
|
|
||||||
## Шаг 4. Выбор цели и набор спринта
|
## Шаг 4. Выбор цели и набор спринта
|
||||||
|
|
||||||
1. **Покажи состояние целей**: линия `PLAN.md` с обоснованием порядка, кусты, и
|
1. **Покажи состояние целей**: «порядок» `PLAN.md` с обоснованием очереди, темы, и
|
||||||
по каждой цели-кандидату — сколько под ней задач без открытых вопросов
|
по каждой цели-кандидату — сколько под ней задач без открытых вопросов
|
||||||
(`list --goal <слаг>`). Цель без готовых задач набором не станет: её сперва
|
(`list --goal <слаг>`). Цель без готовых задач набором не станет: её сперва
|
||||||
надо декомпозировать.
|
надо декомпозировать.
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ description: Ведение задач и целей как каталога mar
|
|||||||
```
|
```
|
||||||
docs/tasks/
|
docs/tasks/
|
||||||
items/ задачи и цели файлами, <slug>.md, слаги английские
|
items/ задачи и цели файлами, <slug>.md, слаги английские
|
||||||
PLAN.md оглавление целей: линия (упорядоченная) и кусты
|
PLAN.md оглавление целей: порядок (значим) и темы (без порядка)
|
||||||
BACKLOG.md что можно взять — только задачи, целей здесь нет
|
BACKLOG.md что можно взять — только задачи, целей здесь нет
|
||||||
SPRINT.md текущий спринт: цель, набор, дата
|
SPRINT.md текущий спринт: цель, набор, дата
|
||||||
REJECTED.md ушедшее БЕЗ реализации, с причиной и датой
|
REJECTED.md ушедшее БЕЗ реализации, с причиной и датой
|
||||||
@@ -80,10 +80,10 @@ docs/tasks/
|
|||||||
## Цели
|
## Цели
|
||||||
|
|
||||||
**Цель — такой же файл в `items/`, тип `[goal]`**, перечисленный в `PLAN.md`:
|
**Цель — такой же файл в `items/`, тип `[goal]`**, перечисленный в `PLAN.md`:
|
||||||
либо звено упорядоченной **линии** продукта (с обоснованием порядка прозой),
|
либо цель из секции **порядок** — там очередь значима и обоснована прозой, — либо
|
||||||
либо тематический **куст** — цель, в последовательность не встающая («прочность
|
**тематическая**, в порядок не встающая («прочность слияния», «журнал и
|
||||||
слияния», «журнал и пересборка»). Без второй части половина целей была бы нигде
|
пересборка»). Без второй секции половина целей была бы нигде не перечислена:
|
||||||
не перечислена: находки ревью не служат ничему из линии.
|
находки ревью не служат ничему из порядка.
|
||||||
|
|
||||||
- **Список задач цели выводится, а не хранится.** В теле цели — зачем она и что
|
- **Список задач цели выводится, а не хранится.** В теле цели — зачем она и что
|
||||||
считается её завершением; перечня задач там нет. Он был бы третьим индексом и
|
считается её завершением; перечня задач там нет. Он был бы третьим индексом и
|
||||||
@@ -205,7 +205,7 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап
|
|||||||
работа — цель (`--type goal`).
|
работа — цель (`--type goal`).
|
||||||
4. **Цель задачи.** У каждой задачи должен быть `--goal <слаг>`: задача вне цели
|
4. **Цель задачи.** У каждой задачи должен быть `--goal <слаг>`: задача вне цели
|
||||||
не попадёт ни в один спринт. Подходящей цели нет — либо она заводится
|
не попадёт ни в один спринт. Подходящей цели нет — либо она заводится
|
||||||
(`--type goal` кустом), либо это сигнал, что задача никому не служит и
|
(`--type goal` в «темы»), либо это сигнал, что задача никому не служит и
|
||||||
заводить её не надо. У идеи цели может не быть — она проставляется, когда
|
заводить её не надо. У идеи цели может не быть — она проставляется, когда
|
||||||
идея становится задачей.
|
идея становится задачей.
|
||||||
5. `add …`, затем допиши тело редактором: одна фраза, критерии приёмки с
|
5. `add …`, затем допиши тело редактором: одна фраза, критерии приёмки с
|
||||||
|
|||||||
@@ -53,9 +53,9 @@ python3 $tk adopt apply --plan tasks-adopt-plan.json \
|
|||||||
- **английские слаги.** Перевести `taj-brejk-pri-ravnoj-polnote` в
|
- **английские слаги.** Перевести `taj-brejk-pri-ravnoj-polnote` в
|
||||||
`tie-break-equal-completeness` может только тот, кто понимает смысл. `scan`
|
`tie-break-equal-completeness` может только тот, кто понимает смысл. `scan`
|
||||||
честно говорит: проверить надо **все** слаги, признаки транслита — эвристика;
|
честно говорит: проверить надо **все** слаги, признаки транслита — эвристика;
|
||||||
- **цели.** Шаги плана — готовые цели **линии** (порядок и обоснование у них уже
|
- **цели.** Шаги плана — готовые цели из **«порядка»** (очередь и обоснование у
|
||||||
есть); тематические скопления задач — **кусты** («прочность слияния», «журнал
|
них уже есть); тематические скопления задач — **«темы»** («прочность слияния»,
|
||||||
и пересборка»). Предлагаешь ты, назначает человек;
|
«журнал и пересборка»). Предлагаешь ты, назначает человек;
|
||||||
- **что вообще не задача.** Обоснование порядка шагов, абзац прозой, заголовок
|
- **что вообще не задача.** Обоснование порядка шагов, абзац прозой, заголовок
|
||||||
раздела — это не пункты беклога, и они уходят в «не разложилось» с причиной.
|
раздела — это не пункты беклога, и они уходят в «не разложилось» с причиной.
|
||||||
|
|
||||||
@@ -69,11 +69,11 @@ python3 $tk adopt apply --plan tasks-adopt-plan.json \
|
|||||||
2. **`adopt scan`** по всем источникам разом. Один прогон, одна карта: два
|
2. **`adopt scan`** по всем источникам разом. Один прогон, одна карта: два
|
||||||
прохода дадут два несогласованных состояния.
|
прохода дадут два несогласованных состояния.
|
||||||
3. **Заполни карту**: `slug` (английский), `section`, `goal` у каждой записи;
|
3. **Заполни карту**: `slug` (английский), `section`, `goal` у каждой записи;
|
||||||
список `goals` — из шагов плана и из кустов. Закрытый шаг плана целью не
|
список `goals` — из шагов плана и из тем. Закрытый шаг плана целью не
|
||||||
заводится. Пустой `goal` — законный исход только у идеи.
|
заводится. Пустой `goal` — законный исход только у идеи.
|
||||||
4. **Покажи человеку карту** через `AskUserQuestion`, ≤3 вопроса за итерацию,
|
4. **Покажи человеку карту** через `AskUserQuestion`, ≤3 вопроса за итерацию,
|
||||||
рекомендация первым вариантом. Показывается: сколько записей, предлагаемые
|
рекомендация первым вариантом. Показывается: сколько записей, предлагаемые
|
||||||
цели (линия и кусты) с обоснованием, спорные отнесения, список «не
|
цели (порядок и темы) с обоснованием, спорные отнесения, список «не
|
||||||
разложилось». Массовые механические решения (слаги, порядок строк) не
|
разложилось». Массовые механические решения (слаги, порядок строк) не
|
||||||
выносятся — это механика.
|
выносятся — это механика.
|
||||||
5. **`adopt apply`.** `--refs` перечисляет **всё**, где могут стоять ссылки на
|
5. **`adopt apply`.** `--refs` перечисляет **всё**, где могут стоять ссылки на
|
||||||
@@ -113,7 +113,7 @@ take` такую задачу не возьмёт). Закрывается эт
|
|||||||
## Доклад
|
## Доклад
|
||||||
|
|
||||||
- Источники и что в каждом распознано (раскладка, индекс, кладбище, секции).
|
- Источники и что в каждом распознано (раскладка, индекс, кладбище, секции).
|
||||||
- Сколько записей перенесено, сколько целей заведено (линия / кусты) и откуда
|
- Сколько записей перенесено, сколько целей заведено (порядок / темы) и откуда
|
||||||
каждая выведена.
|
каждая выведена.
|
||||||
- **Переименования**: сколько слагов, сколько ссылок поправлено и в скольких
|
- **Переименования**: сколько слагов, сколько ссылок поправлено и в скольких
|
||||||
файлах — числом, а не «поправлены ссылки».
|
файлах — числом, а не «поправлены ссылки».
|
||||||
|
|||||||
@@ -42,9 +42,9 @@
|
|||||||
существующий файл. Нашлось в `REJECTED.md` — это сигнал: причина отказа могла
|
существующий файл. Нашлось в `REJECTED.md` — это сигнал: причина отказа могла
|
||||||
устареть, выноси пользователю, а не заводи молча заново.
|
устареть, выноси пользователю, а не заводи молча заново.
|
||||||
4. **Разложи по целям.** У каждой заводимой задачи должен быть `goal:<слаг>`.
|
4. **Разложи по целям.** У каждой заводимой задачи должен быть `goal:<слаг>`.
|
||||||
Половина находок ревью не служит ничему из линии продукта — их цель это
|
Половина находок ревью не служит ничему из порядка — их цель **тематическая**
|
||||||
**куст** («прочность слияния», «журнал и пересборка», «наблюдаемость»).
|
(«прочность слияния», «журнал и пересборка», «наблюдаемость»).
|
||||||
Подходящего куста нет — заведи его целью (`add --type goal --section кусты`)
|
Подходящей темы нет — заведи её целью (`add --type goal --section темы`)
|
||||||
в том же проходе: без цели задача не попадёт ни в один спринт, а значит не
|
в том же проходе: без цели задача не попадёт ни в один спринт, а значит не
|
||||||
будет сделана никогда.
|
будет сделана никогда.
|
||||||
5. **Покажи карту до создания файлов.** Кластер → задача / идея / строка в
|
5. **Покажи карту до создания файлов.** Кластер → задача / идея / строка в
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
```markdown
|
```markdown
|
||||||
# [goal] Прочность слияния
|
# [goal] Прочность слияния
|
||||||
|
|
||||||
**Секция:** кусты · **Теги:** decomposed
|
**Секция:** темы · **Теги:** decomposed
|
||||||
|
|
||||||
Ради чего: точки из разных доставок сходятся в один часовой объект, и сегодня
|
Ради чего: точки из разных доставок сходятся в один часовой объект, и сегодня
|
||||||
исход столкновения зависит от порядка доставки, а не от содержания.
|
исход столкновения зависит от порядка доставки, а не от содержания.
|
||||||
@@ -156,7 +156,7 @@
|
|||||||
|
|
||||||
| Файл | Что отвечает | Секции |
|
| Файл | Что отвечает | Секции |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `PLAN.md` | какие есть цели, в каком порядке идёт линия и почему | линия (упорядоченная) и кусты |
|
| `PLAN.md` | какие есть цели, в какой очереди идут и почему | порядок (очередь значима) и темы (порядка нет) |
|
||||||
| `BACKLOG.md` | что **можно взять** — только задачи | секции проекта (по умолчанию ядро/инфра) |
|
| `BACKLOG.md` | что **можно взять** — только задачи | секции проекта (по умолчанию ядро/инфра) |
|
||||||
| `SPRINT.md` | какая цель и какой набор под неё | одна: «Набор» |
|
| `SPRINT.md` | какая цель и какой набор под неё | одна: «Набор» |
|
||||||
| `REJECTED.md` | что ушло без реализации и почему | — |
|
| `REJECTED.md` | что ушло без реализации и почему | — |
|
||||||
@@ -169,9 +169,9 @@
|
|||||||
ответа человека, а следы остаются вопросами в файлах задач распущенного спринта.
|
ответа человека, а следы остаются вопросами в файлах задач распущенного спринта.
|
||||||
Постоянно пустая секция со старой семантикой «разбираются пачками» противоречила
|
Постоянно пустая секция со старой семантикой «разбираются пачками» противоречила
|
||||||
бы правилу «эскалируем немедленно», поэтому `init` её не заводит, а `check`
|
бы правилу «эскалируем немедленно», поэтому `init` её не заводит, а `check`
|
||||||
говорит о ней в чужом беклоге. Переезжаешь с такой секцией — удали её. В **линии** плана порядок значим и
|
говорит о ней в чужом беклоге. Переезжаешь с такой секцией — удали её. В секции
|
||||||
обосновывается прозой; двигают строку `move <slug> --section линия --after
|
**«порядок»** очередь значима и обосновывается прозой; двигают строку
|
||||||
<другой>`.
|
`move <slug> --section порядок --after <другой>`.
|
||||||
|
|
||||||
Индексы **производны**: расходятся с файлом — правим индексы (`check --fix`).
|
Индексы **производны**: расходятся с файлом — правим индексы (`check --fix`).
|
||||||
Строку руками не пишут.
|
Строку руками не пишут.
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ av-dev, и подгоняется под него проект. Имена вн
|
|||||||
|
|
||||||
docs/tasks/
|
docs/tasks/
|
||||||
items/ задачи и цели файлами, <slug>.md
|
items/ задачи и цели файлами, <slug>.md
|
||||||
PLAN.md оглавление целей: линия (упорядоченная) и кусты
|
PLAN.md оглавление целей: порядок (значим) и темы (без порядка)
|
||||||
BACKLOG.md что можно взять — только задачи, целей здесь нет
|
BACKLOG.md что можно взять — только задачи, целей здесь нет
|
||||||
SPRINT.md текущий спринт: цель, набор, дата, слаг
|
SPRINT.md текущий спринт: цель, набор, дата, слаг
|
||||||
REJECTED.md ушедшее БЕЗ реализации, с причиной и датой
|
REJECTED.md ушедшее БЕЗ реализации, с причиной и датой
|
||||||
@@ -110,7 +110,7 @@ DEFAULTS = {
|
|||||||
PATH_KEYS = ("items", "backlog", "plan", "sprint", "rejected")
|
PATH_KEYS = ("items", "backlog", "plan", "sprint", "rejected")
|
||||||
|
|
||||||
DEFAULT_SECTIONS = "ядро,инфра"
|
DEFAULT_SECTIONS = "ядро,инфра"
|
||||||
DEFAULT_PLAN_SECTIONS = "линия,кусты"
|
DEFAULT_PLAN_SECTIONS = "порядок,темы"
|
||||||
|
|
||||||
META_FIELD = re.compile(r"^\*\*(.+?):\*\*\s*(.*)$")
|
META_FIELD = re.compile(r"^\*\*(.+?):\*\*\s*(.*)$")
|
||||||
INDEX_ENTRY = re.compile(r"^- \[(.+?)\]\((.+?\.md)\)\s*(?:—\s*(.*))?$")
|
INDEX_ENTRY = re.compile(r"^- \[(.+?)\]\((.+?\.md)\)\s*(?:—\s*(.*))?$")
|
||||||
@@ -1838,8 +1838,8 @@ def init_files(lay: Layout, sections: list[str], plan_sections: list[str],
|
|||||||
"# План\n\n"
|
"# План\n\n"
|
||||||
f"Оглавление целей. Цель — файл `[goal]` в `{lay.cfg['items']}/`; её задачи\n"
|
f"Оглавление целей. Цель — файл `[goal]` в `{lay.cfg['items']}/`; её задачи\n"
|
||||||
"здесь **не перечисляются** — перечень даёт `tasks.py list --goal <слаг>`.\n"
|
"здесь **не перечисляются** — перечень даёт `tasks.py list --goal <слаг>`.\n"
|
||||||
f"Первая секция («{plan_sections[0]}») упорядочена, и порядок обосновывается\n"
|
f"В первой секции («{plan_sections[0]}») очередь значима и обосновывается\n"
|
||||||
"прозой; остальные — тематические кусты без порядка.\n\n"
|
"прозой; в остальных порядка нет — это тематические цели.\n\n"
|
||||||
+ "".join(f"## {s}\n\n" for s in plan_sections))
|
+ "".join(f"## {s}\n\n" for s in plan_sections))
|
||||||
out[lay.index("sprint")] = empty_sprint(lay)
|
out[lay.index("sprint")] = empty_sprint(lay)
|
||||||
out[lay.index("rejected")] = (
|
out[lay.index("rejected")] = (
|
||||||
@@ -1976,8 +1976,8 @@ STEP = re.compile(r"^\**\s*(\d+)[.)]\s*\**\s*(.+?)\**\s*$")
|
|||||||
def scan_list_file(path: Path) -> dict:
|
def scan_list_file(path: Path) -> dict:
|
||||||
"""TODO.md, «планы» в README, список шагов в плане проекта.
|
"""TODO.md, «планы» в README, список шагов в плане проекта.
|
||||||
|
|
||||||
**Нумерованный шаг плана → кандидат в цель линии** (готовая цель: у него уже
|
**Нумерованный шаг плана → кандидат в цель из «порядка»** (готовая цель: у
|
||||||
есть порядок и обоснование), прочий пункт списка → кандидат в задачу. Ничего
|
него уже есть очередь и обоснование), прочий пункт → кандидат в задачу. Ничего
|
||||||
не решает: и то и другое едет в карту предложением, назначает человек.
|
не решает: и то и другое едет в карту предложением, назначает человек.
|
||||||
"""
|
"""
|
||||||
found: dict = {"kind": "list-file", "source": str(path), "items": [],
|
found: dict = {"kind": "list-file", "source": str(path), "items": [],
|
||||||
@@ -2043,7 +2043,7 @@ def cmd_adopt_scan(a: argparse.Namespace) -> int:
|
|||||||
rejected += sc.get("rejected", [])
|
rejected += sc.get("rejected", [])
|
||||||
unclassified += sc.get("unclassified", [])
|
unclassified += sc.get("unclassified", [])
|
||||||
goals += [{"slug": "", "title": g["title"],
|
goals += [{"slug": "", "title": g["title"],
|
||||||
"section": (a.plan_sections.split(",")[0].strip() or "линия"),
|
"section": (a.plan_sections.split(",")[0].strip() or "порядок"),
|
||||||
"from": g["from"], "step": g.get("step"), "done": g.get("done"),
|
"from": g["from"], "step": g.get("step"), "done": g.get("done"),
|
||||||
"body": f"Выведена из шага «{g['title']}» ({g['from']})."
|
"body": f"Выведена из шага «{g['title']}» ({g['from']})."
|
||||||
+ ("\n\nШаг помечен закрытым — цель, скорее всего,"
|
+ ("\n\nШаг помечен закрытым — цель, скорее всего,"
|
||||||
|
|||||||
Reference in New Issue
Block a user