Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4e452f2232 | |||
| 69f454b28a | |||
| 4b37a099b4 | |||
| da83b27cc7 | |||
| 2372db71e0 | |||
| d0d05d4fcc | |||
| a3998f0d6e | |||
| 9b97bc55ca | |||
| 5012f1585e |
@@ -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
@@ -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 (уборка правил) — не начат.
|
||||
|
||||
## Алерт-индикаторы
|
||||
|
||||
✅ — норма ・ ⚠️ — внимание ・ 🔴 — действие требуется ・ ⚪ — не запускалось
|
||||
|
||||
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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 deferred → 75 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', () => {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user