Compare commits

...

9 Commits

Author SHA1 Message Date
Дмитрий 4e452f2232 feat(continuity): STATUS.md «Активные проекты» + tracker (task 13)
status-md-generator рендерит блок «Активные многоэтапные проекты»
из repo-local docs/observer/active-projects.md (если файл есть).
renderStatus backward-compatible: без activeProjects блок пустой.

active-projects.md — single source состояния многоэтапного router
overhaul (этап 1  закрыт, этапы 2-4 pending). Будущая сессия видит
статус в STATUS.md dashboard + memory tracker.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 19:39:29 +03:00
Дмитрий 69f454b28a docs(registry): полный README.md (task 12)
Структура узла (9 полей + 3 trigger типа + 3 boundary типа), status
маппинг, процесс добавления узла, auto-render, lefthook gate, cross-refs
на spec/plan/Pravila/ADR-011/router-procedure/routing-off-phase.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 19:37:11 +03:00
Дмитрий 4b37a099b4 fix(lefthook): registry-render-check — YAML block scalar (task 11 followup)
Inline `run: cmd || { ... }` ломал YAML-парсер lefthook
(`mapping values are not allowed in this context`, line 234).
Переписано как YAML block scalar `run: |` с `if/then/fi` — чисто,
без shell-зависимости от `||`/`{ ... }` brace-syntax.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 16:34:24 +03:00
Дмитрий da83b27cc7 feat(lefthook): registry-render-check pre-commit warn-only (task 11)
Job 17 в pre-commit срабатывает на изменения nodes.yaml /
Tooling_v8_3.md / routing-off-phase.md. Warn-only первую неделю:
`|| exit 0` печатает WARN, но не блокирует коммит. После
стабилизации (Task 13 закроется PR'ом) — убрать `|| ...` и сделать
blocking gate.

Сценарий: правишь nodes.yaml без вызова renderer'а → коммит
проходит с WARN-сообщением `rendered != файл, запусти ...`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 16:33:45 +03:00
Дмитрий 2372db71e0 docs(registry): re-render Tooling §4.0 на полном реестре 83 узлов (task 10)
Auto-region <!-- auto:tooling-registry-summary --> в docs/Tooling_v8_3.md
обновлён рендером из docs/registry/nodes.yaml (3 → 83 строки).

routing-off-phase auto-region остался без изменений: routing-table
выводит только classifications, а в реестре их два узла (#18 Pest + #19
Superpowers, 5 строк). Keyword-based routing — отдельная задача
(этап 3, классификатор).

Diff: +80 строк строго внутри маркеров auto-region. --check mode прошёл.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 16:32:21 +03:00
Дмитрий d0d05d4fcc fix(registry): chain_membership alphabetic sort per code review (task 9)
6 узлов имели numeric sort (L7,L13) вместо alphabetic (L13,L7):
#10 Boost / #25 Semgrep / #34 Sentry / #35 Redis / #39 Trail of Bits / #43 deptrac.

Alphabetic порядок («L13» < «L7» char-by-char) — спецификация
этапа 1 (rendered tables дают стабильный output без числовых сюрпризов).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 16:25:20 +03:00
Дмитрий a3998f0d6e feat(registry): +16 chains L1-L16 + chain_membership на 83 узлах (task 9)
Заменил pilot chains (L1 brainstorming-skill / L8 TDD-skill) на полные
16 цепочек из routing-off-phase.md §4 v1.6:
  L1 feature discovery & implementation
  L2 system orientation
  L3 as-is ↔ to-be process
  L4 diagram rendering
  L5 architecture triangle
  L6 security layered
  L7 integration development
  L8 runtime debug (Sentry+Redis+systematic-debug)
  L9 project management
  L10 LLM feature
  L11 Claude infra extension
  L12 CLAUDE.md capture
  L13 finance chain
  L14 backend-quality chain
  L15 security go-live chain
  L16 marketing chain

chain_membership обновлён на каждом участвующем узле (sorted).
Pilot L1/L8 переопределены под routing-off-phase: #19 Superpowers
больше не в L1/L8; #18 Pest перенесён в L13.

Task 9 закрывает Phase B плана (Task 8+9). Task 10 - render check.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 16:21:00 +03:00
Дмитрий 9b97bc55ca feat(registry): +узлы #56..#83 (off-phase поздние, task 8d)
28 узлов: authoring-tooling (#56-58), dev-support (#59-60),
finance-tooling (#61-63), backend-tooling (#64-67), infosec-tooling (#68-73),
marketing-tooling (#74-83).

Status: 25 active + 3 deferred (#67 NightOwl — pending Б-1/Linux, #82
DataForSEO — post-Б-1, #83 Unisender Go — нет upstream MCP).

Итого в реестре: 83 узла (полное покрытие Tooling Прил. Н §4.X).
Task 8 (перенос узлов) закрыт; Task 9 добавит L1-L16 chains.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 16:07:54 +03:00
Дмитрий 5012f1585e feat(registry): +узлы #36..#55 (off-phase средние, task 8c)
20 узлов: architecture-tooling (#36-38, #43), audit-security (#39-40),
project-management (#41-42), design-tooling (#44-46), integration-tooling (#47),
ml-ai-tooling (#48-50), business-process (#51-54), discovery-tooling (#55).

Status: 17 active + 3 deferred (#44 Figma — нет аккаунта, #50 Jupyter —
нет Python ML-окружения, #54 n8n-mcp — нет n8n в стеке).

Итого в реестре: 55 узлов.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 15:54:08 +03:00
8 changed files with 1158 additions and 30 deletions
+80
View File
@@ -368,9 +368,89 @@ Existing prose follows the table.
| ID | Узел | Категория | Статус |
|---|---|---|---|
| #2 | Playwright MCP | phase-0 | active |
| #3 | GitHub MCP | phase-0 | active |
| #4 | markdownlint-cli2 | phase-0 | active |
| #5 | cspell | phase-0 | active |
| #6 | lychee | phase-0 | active |
| #7 | Stylelint | phase-0 | active |
| #8 | gitleaks | phase-0 | active |
| #9 | Pa11y | phase-0 | active |
| #10 | Laravel Boost | phase-1 | active |
| #11 | Laravel Pint | phase-1 | active |
| #12 | Larastan | phase-1 | active |
| #13 | Roave/SecurityAdvisories | phase-1 | active |
| #14 | Laravel IDE Helper | phase-1 | active |
| #15 | squawk | phase-1 | active |
| #16 | pgFormatter | phase-1 | active |
| #17 | pg_partman | phase-1 | dormant |
| #19 | Superpowers v5.1.0 | phase-2 | active |
| #18 | Pest 4 | phase-1 | active |
| #1 | PostgreSQL MCP | phase-0 | historic |
| #20 | Volar | phase-2 | active |
| #21 | vue-tsc | phase-2 | active |
| #22 | ESLint + Prettier + plugin-vue + config-prettier | phase-2 | active |
| #23 | Vitest | phase-2 | active |
| #24 | Histoire | phase-2 | active |
| #25 | Semgrep + Semgrep MCP | phase-3 | active |
| #26 | Trivy | phase-3 | active |
| #27 | GitHub Dependabot | phase-3 | active |
| #28 | pg_audit | phase-3 | active |
| #29 | pg_anonymizer | phase-3 | active |
| #30 | Frontend Design plugin | phase-2 | active |
| #31 | UI UX Pro Max | off-phase | active |
| #32 | 21st.dev Magic MCP | off-phase | active |
| #33 | claude-md-management | off-phase | active |
| #34 | Sentry MCP | off-phase | active |
| #35 | Redis MCP | off-phase | active |
| #36 | adr-kit | off-phase | active |
| #37 | mermaid-skill | off-phase | active |
| #38 | architecture-patterns | off-phase | active |
| #39 | Trail of Bits Skills | off-phase | active |
| #40 | Security Guidance | off-phase | active |
| #41 | CCPM | off-phase | active |
| #42 | product-management | off-phase | active |
| #43 | deptrac | off-phase | active |
| #44 | Figma MCP | off-phase | deferred |
| #45 | Universal Icons MCP | off-phase | active |
| #46 | Design plugin | off-phase | active |
| #47 | openapi-mcp-server | off-phase | active |
| #48 | promptfoo | off-phase | active |
| #49 | Data Scientist skill | off-phase | active |
| #50 | Jupyter MCP | off-phase | deferred |
| #51 | operations | off-phase | active |
| #52 | process-modeling | off-phase | active |
| #53 | process-analysis | off-phase | active |
| #54 | n8n-mcp | off-phase | deferred |
| #55 | discovery-interview | off-phase | active |
| #56 | skill-creator | off-phase | active |
| #57 | plugin-dev | off-phase | active |
| #58 | hookify | off-phase | active |
| #59 | claude-code-setup | off-phase | active |
| #60 | context7 | off-phase | active |
| #61 | finance plugin | off-phase | active |
| #62 | billing-audit | off-phase | active |
| #63 | ru-tax-accounting | off-phase | active |
| #64 | Rector | off-phase | active |
| #65 | PHP Insights | off-phase | active |
| #66 | laravel-backend-patterns | off-phase | active |
| #67 | NightOwl | off-phase | deferred |
| #68 | OWASP ZAP | off-phase | active |
| #69 | Nuclei | off-phase | active |
| #70 | Ward | off-phase | active |
| #71 | pdn-152fz-audit | off-phase | active |
| #72 | threat-model | off-phase | active |
| #73 | security-go-live | off-phase | active |
| #74 | marketing | off-phase | active |
| #75 | marketingskills | off-phase | active |
| #76 | brand-voice | off-phase | active |
| #77 | marketing-ru | off-phase | active |
| #78 | Яндекс.Метрика MCP | off-phase | active |
| #79 | Яндекс.Директ+Wordstat MCP | off-phase | active |
| #80 | Telegram MCP | off-phase | active |
| #81 | Postiz | off-phase | active |
| #82 | DataForSEO MCP | off-phase | deferred |
| #83 | Unisender Go MCP | off-phase | deferred |
<!-- auto:tooling-registry-summary:end -->
+12 -4
View File
@@ -1,6 +1,6 @@
# Brain Status (auto-generated)
Last updated: 2026-05-23T11:29:38.516Z
Last updated: 2026-05-23T16:38:59.719Z
| Контролёр | Состояние | Детали |
|---|---|---|
@@ -8,16 +8,24 @@ Last updated: 2026-05-23T11:29:38.516Z
| C2 Cross-ref consistency | ✅ | [cross-ref-checker] OK — 0 drift in 4 files |
| C3 Observer-of-observer | ✅ | [observer-of-observer] OK — last read 0 week(s) ago |
| C4 Сигнальный статус | ✅ | This file (self-reference) |
| C5 Observer-coverage | ⚠️ | 155 episode(s) this month · Stop-hook + post-commit OK · 21 missed activation(s) — see /brain-retro |
| C5 Observer-coverage | ⚠️ | 165 episode(s) this month · Stop-hook + post-commit OK · 21 missed activation(s) — see /brain-retro |
| C6 Chain map sync | ✅ | [chain-map-checker] OK — 16 chains in sync |
## Метрики (информационные, не алерты)
- Observer evidence: 155 episodes this month, 0 observer_error markers, 74 PII matches before filter
- Legacy v1 episodes (not in factor analysis): 16
- Observer evidence: 165 episodes this month, 0 observer_error markers, 83 PII matches before filter
- Legacy v1 episodes (not in factor analysis): 26
- Last /brain-retro: 0 day(s) ago
- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 21. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store).
## Активные многоэтапные проекты
- **Router discipline overhaul** ([spec](../superpowers/specs/2026-05-23-router-discipline-overhaul-design.md))
- Этап 1 (машиночитаемый реестр) ✅ закрыт 2026-05-23 — `docs/registry/nodes.yaml` (83 узла + 16 chains L1-L16), `tools/registry-load.mjs` + `tools/registry-render.mjs` (16 тестов), auto-render Tooling §4.0 + routing-off-phase, lefthook job 17 (warn-only).
- Этап 2 (измерения + классификатор-парсер) ⏸ ждёт «продолжаем» от заказчика. Plan: TBD.
- Этап 3 (принуждение — хук на routing) — не начат.
- Этап 4 (уборка правил) — не начат.
## Алерт-индикаторы
✅ — норма ・ ⚠️ — внимание ・ 🔴 — действие требуется ・ ⚪ — не запускалось
+5
View File
@@ -0,0 +1,5 @@
- **Router discipline overhaul** ([spec](../superpowers/specs/2026-05-23-router-discipline-overhaul-design.md))
- Этап 1 (машиночитаемый реестр) ✅ закрыт 2026-05-23 — `docs/registry/nodes.yaml` (83 узла + 16 chains L1-L16), `tools/registry-load.mjs` + `tools/registry-render.mjs` (16 тестов), auto-render Tooling §4.0 + routing-off-phase, lefthook job 17 (warn-only).
- Этап 2 (измерения + классификатор-парсер) ⏸ ждёт «продолжаем» от заказчика. Plan: TBD.
- Этап 3 (принуждение — хук на routing) — не начат.
- Этап 4 (уборка правил) — не начат.
+102 -2
View File
@@ -1,5 +1,105 @@
# Node Registry
Машиночитаемый реестр узлов тулчейна Лидерры. Single source of truth для router-procedure.md и хуков enforcement'а.
Машиночитаемый реестр узлов тулчейна Лидерры — single source of truth для `router-procedure.md`, хуков enforcement'а (этапы 2-3 router discipline overhaul) и auto-rendered секций в нормативке.
**Полная документация:** TBD (закроется в Task 13).
## Файлы
- **`nodes.yaml`** — реестр 83 узлов + 16 цепочек L1-L16. Источник истины.
- **`schema.json`** — JSON Schema, валидация `nodes.yaml` при загрузке.
- **`README.md`** — этот файл.
## Как читать узел
```yaml
- id: "#19" # уникальный идентификатор из Tooling Прил. Н §0
name: "Superpowers v5.1.0"
slug: "superpowers" # каноническое имя для invocation (kebab-ASCII)
category: "phase-2" # phase-0 / phase-1 / phase-2 / phase-3 / off-phase
subcategory: null # либо строка (architecture-tooling, debug-runtime, ...)
status: "active" # active | dormant | deferred | historic
dormancy_reason: null # null если active, иначе текст причины
triggers: # как роутер выбирает узел
- {classification: "feature", weight: 1.0}
- {keyword: "tdd", weight: 1.0}
- {file_pattern: "tests/**/*.php", weight: 1.0}
boundaries: # связи с другими узлами (ADR, paired stack, replaces)
- {adr: "ADR-011", role: "hard-floor source"}
- {pair: "#30", relation: "paired stack"}
chain_membership: ["L1", "L8"] # в каких L-цепочках участвует (sorted)
attributes: # свободная map для прочих метаданных
tooling_section: "§3.3 #19"
install: "marketplace plugin"
```
### Status маппинг
| Status | Что значит |
|---|---|
| `active` | Узел активно используется. |
| `dormant` | Узел отключён/заменён без эквивалента. Артефакт реестра сохраняется (#17 pg_partman — заменён ручным cron'ом). |
| `deferred` | Узел запланирован, но pending Б-1 / undeployed dependencies (#34 Sentry, #44 Figma, #67 NightOwl, #82 DataForSEO, #83 Unisender Go). |
| `historic` | Узел заменён другим узлом реестра (`{pair: "#N", relation: "replaced by"}`). #1 PG MCP заменён #10 Boost. |
### Trigger типы
- `{keyword: "<lowercase trimmed>", weight}` — exact-match по фразе.
- `{classification: "<class>", weight}` — соответствие классу задачи (feature/planning/bugfix/refactor/...).
- `{file_pattern: "<glob>", weight}` — соответствие пути файла (`tests/**/*.php`).
Weight — number ∈ `[0, 1]`. По умолчанию 1.0.
### Boundaries
- `{adr: "ADR-XXX", role: "<role>"}` — узел связан с ADR-решением.
- `{pair: "#N", relation: "<rel>"}` — узел связан с другим узлом реестра (`replaces`, `replaced by`, `paired stack`).
- `{relation: "<text>"}` — свободная связь (правила PSR_v1, описательная роль).
## Как добавить новый узел
1. Получить новый `#N` из [Tooling Прил. Н §0](../Tooling_v8_3.md) (канон счётчика).
2. Открыть `nodes.yaml`, добавить блок в массив `nodes:` (в правильное место по числовой сортировке).
3. **Триггеры:** что должен сказать заказчик / какой класс задач включает узел. Lowercase, trimmed, без двоеточий.
4. **Границы:** какие ADR разделяют узел от соседей, есть ли paired stack.
5. Прогнать рендер: `node tools/registry-render.mjs` — должно перерендерить `Tooling §4.0` + `routing-off-phase` routing-table.
6. Запустить тесты: `cd app && npx vitest --config vitest.config.tools.mjs run ../tools/registry-load.test.mjs`. Все должны быть GREEN.
7. Закоммитить YAML + Tooling/routing-off-phase одним коммитом.
## Auto-render
`tools/registry-render.mjs` пишет в auto-region маркеры:
- `<!-- auto:tooling-registry-summary:begin -->` в `docs/Tooling_v8_3.md` §4.0 (краткая сводка 83 узлов).
- `<!-- auto:routing-table:begin -->` в `docs/routing-off-phase.md` (routing-table по classifications).
**Не правьте содержимое между маркерами вручную** — оно перезатрётся при следующем рендере. Для изменения структуры таблицы — правьте `tools/registry-render.mjs` renderer functions.
Запуск:
```bash
node tools/registry-render.mjs # переписать файлы
node tools/registry-render.mjs --check # exit 1 если drift (для lefthook)
```
## Lefthook gate
`registry-render-check` — pre-commit job 17 в `lefthook.yml`. Триггерится на изменения `docs/registry/nodes.yaml` / `docs/Tooling_v8_3.md` / `docs/routing-off-phase.md`. **Warn-only первую неделю** (`if/then/fi` block, exit 0 даже при drift). Если видишь WARN — запусти:
```bash
node tools/registry-render.mjs && git add docs/Tooling_v8_3.md docs/routing-off-phase.md
```
После стабилизации (когда команда привыкнет к workflow) — убрать warn-fallback и сделать blocking.
## Цепочки L1-L16
16 канонических связок 2+ узлов (см. `chains:` секцию в `nodes.yaml`). Источник истины — [`docs/routing-off-phase.md`](../routing-off-phase.md) §4 (таблица L1-L16). При изменении routing-off-phase — обновляйте chains в `nodes.yaml` синхронно.
## Связано
- Spec: [`docs/superpowers/specs/2026-05-23-router-discipline-overhaul-design.md`](../superpowers/specs/2026-05-23-router-discipline-overhaul-design.md)
- Plan этап 1: [`docs/superpowers/plans/2026-05-23-router-overhaul-stage-1-registry.md`](../superpowers/plans/2026-05-23-router-overhaul-stage-1-registry.md)
- Router procedure: [`docs/router-procedure.md`](../router-procedure.md) (5-шаговая процедура «task → node»)
- Routing-off-phase: [`docs/routing-off-phase.md`](../routing-off-phase.md) (триггеры + L-цепочки)
- ADR-011 — brain governance.
- Pravila §15.2 — pre-flight sync для нормативных файлов.
- Pure modules: `tools/registry-load.mjs` + `tools/registry-render.mjs` + tests `tools/registry-*.test.mjs`.
+929 -17
View File
File diff suppressed because it is too large Load Diff
+15
View File
@@ -224,6 +224,21 @@ pre-commit:
observer-chain-map-checker: дрейф chain-map <-> routing-off-phase.md.
Обновите tools/observer-chain-map.json под таблицу L1-LN.
# 17. registry-render-check — drift между docs/registry/nodes.yaml и
# auto-region маркерами в docs/Tooling_v8_3.md / docs/routing-off-phase.md
# (router overhaul этап 1, task 11). Warn-only первую неделю — `|| exit 0`
# печатает WARN, но не блокирует коммит; после стабилизации убрать `|| ...`
# и сделать blocking.
- name: registry-render-check
glob: "{docs/registry/nodes.yaml,docs/Tooling_v8_3.md,docs/routing-off-phase.md}"
run: |
if ! node tools/registry-render.mjs --check; then
echo "[registry] WARN: rendered != файл. Запусти 'node tools/registry-render.mjs' и закоммить."
fi
fail_text: |
registry-render-check: rendered output расходится с auto-region маркером.
Запустите `node tools/registry-render.mjs` и закоммитьте Tooling/routing-off-phase.
# Post-commit: regenerate STATUS.md dashboard (informational, not gate)
post-commit:
parallel: false
+7 -6
View File
@@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi
describe('registry-load', () => {
beforeEach(() => clearCache());
it('loads registry (35 nodes after task 8b)', () => {
it('loads registry (83 nodes after task 8d)', () => {
const r = loadRegistry();
expect(r.nodes).toHaveLength(35);
expect(r.nodes).toHaveLength(83);
expect(r.version).toBe('0.1.0');
});
@@ -46,8 +46,8 @@ describe('registry-load', () => {
it('findActiveNodes excludes non-active', () => {
const r = loadRegistry();
const active = findActiveNodes(r);
// After task 8b: 35 nodes total; #1 historic, #17 dormant → 33 active
expect(active).toHaveLength(33);
// After task 8d: 83 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred75 active
expect(active).toHaveLength(75);
expect(active.map(n => n.id)).toContain('#18');
expect(active.map(n => n.id)).toContain('#19');
expect(active.map(n => n.id)).not.toContain('#1');
@@ -56,8 +56,9 @@ describe('registry-load', () => {
it('findChainsByNode returns chain membership', () => {
const r = loadRegistry();
const tddChains = findChainsByNode(r, 'superpowers:test-driven-development');
expect(tddChains.map(c => c.chainId)).toContain('L8');
// L8 = runtime debug chain: systematic-debugging + Sentry (#34) + Redis (#35)
const sentryChains = findChainsByNode(r, '#34');
expect(sentryChains.map(c => c.chainId)).toContain('L8');
});
it('caches across calls in same process', () => {
+8 -1
View File
@@ -12,6 +12,10 @@ export function renderStatus(inputs) {
const { now, c1, c2, c3, c5, observer, lastRetroDaysAgo } = inputs;
const c6 = inputs.c6 || { status: 'ok', detail: '—' };
const missed = inputs.missed || { totalMissed: 0, byNode: {}, byClassification: {} };
const activeProjects = (inputs.activeProjects || '').trim();
const projectsBlock = activeProjects
? `\n## Активные многоэтапные проекты\n\n${activeProjects}\n`
: '';
const retroLine = (lastRetroDaysAgo === null || lastRetroDaysAgo === undefined)
? 'never'
: `${lastRetroDaysAgo} day(s) ago`;
@@ -34,7 +38,7 @@ Last updated: ${now}
- Legacy v1 episodes (not in factor analysis): ${observer.v1Episodes || 0}
- Last /brain-retro: ${retroLine}
- Использование узлов: см. \`/brain-retro\` (раз в спринт). missed_activations: ${missed.totalMissed}. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory \`feedback_brain_unused_tools_not_problem\` — outside-repo memory store).
${projectsBlock}
## Алерт-индикаторы
✅ — норма ・ ⚠️ — внимание ・ 🔴 — действие требуется ・ ⚪ — не запускалось
@@ -128,6 +132,9 @@ if (process.argv[1] && process.argv[1].replace(/\\/g, '/').endsWith('/status-md-
},
missed: cov.missed,
lastRetroDaysAgo: lastRetroDaysAgo(),
activeProjects: existsSync('docs/observer/active-projects.md')
? readFileSync('docs/observer/active-projects.md', 'utf-8')
: '',
};
const md = renderStatus(inputs);
writeFileSync('docs/observer/STATUS.md', md);