Commit Graph

665 Commits

Author SHA1 Message Date
Дмитрий 136bad4db2 docs(router-stage3): план — 3 follow-up фикса с TDD-шагами
Декомпозиция: Task 1 (UTF-8 helper + 3 хука), Task 2 (state-enricher),
Task 3 (parser enrichment), Task 4 (smoke + continuity + push).

Subagent-driven последовательно: Task 1-3 Sonnet, Task 4 controller Opus.
Worktree от свежего origin/main + junction'ы. Финал — push на main FF.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 15:20:23 +03:00
Дмитрий 36ada767f4 docs(plan): implementation plan for controller-offload agents (3 tasks)
3-task TDD-ish plan to create two new project agents:
- Task 1: .claude/agents/normative-sync.md (full Sonnet 4.6 system prompt)
- Task 2: .claude/agents/prod-deploy-validator.md (8 SSH checks + quirks 104-108)
- Task 3: First dry-run smoke test for both + capture lessons in memory

Spec: docs/superpowers/specs/2026-05-24-controller-offload-agents-design.md (71a5dd6).
Also: +2 cspell-words (маппинге, dogfooded).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 15:19:01 +03:00
Дмитрий 5f9bd07dd9 docs(router-stage3): spec — три follow-up фикса (UTF-8 + recommended_node + chain_progress)
3 дыры обнаружены при инспекции warn-only состояния сторожа 24.05.2026:
1. UTF-8 mojibake в state-файле сторожа (Windows Node stdin без setEncoding).
2. recommended_node не пишется в эпизоды наблюдателя (helper существует, не подключён).
3. chain_progress / chain_completed / recommended_chain — то же.

Без починки brain-retro новых метрик (domainHitRate / chainCompletionRate)
покажет пустоту, а Layer 2 эскалация на русских промптах работает по
испорченному тексту. Stage 3 enforce включать до фиксов нельзя.

Spec scoped к 3 файлам кода + ≤80 строкам нетто; subagent-driven
последовательно (3 Sonnet + closure Opus). Smoke на живой сессии.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 15:13:18 +03:00
Дмитрий 71a5dd6f6d docs(spec): controller-offload agents design (normative-sync + prod-deploy-validator)
Spec for two specialized AI agents to offload the main controller:
- #1 normative-sync: applies 4-file normative sync (Pravila/PSR/Tooling/CLAUDE.md)
  after a completed task. ~20 invocations/week, saves ~70K controller tokens
  per episode. Model: Sonnet 4.6.
- #2 prod-deploy-validator: 8-check pre-flight before liderra.ru deploy.
  ~5-7 invocations/week. Driven by 24.05 03:46 UTC 18-min portal incident
  (quirk 107 — config:cache not under www-data). Model: Sonnet 4.6.

Based on brainstorming session 24.05 with measured frequencies from
MEMORY.md + CLAUDE.md §6 + push history 16-24.05.

Precedents: pest-parallel-debugger, rls-reviewer project agents.

Also: +7 cspell-words entries for the new spec.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 15:11:43 +03:00
Дмитрий 4dbf78b204 docs(billing): plan — legacy ProcessWebhookJob removal implementation
7 фаз: Phase 0 worktree → Phase 1 impact-checks (8 grep'ов) →
Phase 2 удаление core (job + 1 dedicated test) →
Phase 3 удаление обвязки (controller + route + model + conditional
NotificationService методы + Mailable) →
Phase 4 DROP-миграция БД (3 таблицы + 2 колонки tenants) →
Phase 5 регрессия + code review →
Phase 6 merge + deploy + 7д наблюдение.

Все conditional-блоки гейтятся на impact-checks Phase 1
(финальный список — Task 1.8 inline).

Spec: 2026-05-24-legacy-direct-webhook-removal-design.md

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 15:05:19 +03:00
Дмитрий b103c8819c docs(billing): spec — remove legacy ProcessWebhookJob (direct webhook channel)
Pre-sharing-эпик legacy: ProcessWebhookJob + WebhookReceiveController +
POST /api/webhook/{token} + webhook_log/webhook_dedup_keys/tenants.webhook_token.
На проде 0 вызовов за всю историю. Не часть актуальной архитектуры каналов
(основной = шеринг crm.bp-gr.ru, резервный = CSV reconcile — оба уже на always-rub).

Удаление снимает блокер для Phase B Спека A (DROP COLUMN balance_leads),
закрывает публичный endpoint /api/webhook/{token}, убирает расхождение
биллинг-моделей в коде.

Approach: одним PR, одним релизом. Бэкап перед миграцией, 7д наблюдение.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 14:47:43 +03:00
Дмитрий 554b1f4aa3 docs(continuity): stages 2+3 router overhaul merged + warn-only active
active-projects.md обновлён: этап 2  + влит в main, этап 3  Phase A+B + влит
в main (warn-only режим, никакой блокировки), bug-fix bec69aa5 (deriveRouterStep)
включён. CHECKPOINT B накапливает реальные наблюдения; Task 9 (переключение
в enforce + 2 метрики) — отдельно после ревью baseline.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 13:37:42 +03:00
Дмитрий dd0ac43052 chore(observer): commit live router-classification episodes (stage 3 warn-only)
Эпизоды реальных сессий после hotfix — сторож пишет state + классификацию
на каждый промпт (verified: UUID-session state files). Данные для brain-retro
warn-only ревью.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 11:40:05 +03:00
Дмитрий 57bd85edc6 fix(router): prehook reads 'prompt' field + remove matcher from UserPromptSubmit (stage 3 hotfix)
Two real bugs found via verification (hook didn't fire in live session):
1. UserPromptSubmit block had matcher:"*" — event doesn't support matcher,
   non-standard block dropped (claude-code-guide authoritative). Removed →
   block now {hooks:[...]} like working observer-stop-hook.
2. stdin field was event.user_prompt; Claude Code sends event.prompt.
   Now reads (event.prompt || event.user_prompt) for compat.

Field-fix verified manually with real stdin shape {prompt:...} → #71 pdn-152fz.
Firing fix (matcher) NOT verifiable in-session (hooks load at session start) —
needs restart + next-turn state-file check.

NB stop-gate turn_events field also wrong (Stop sends transcript_path) — separate
follow-up, not on observation critical path (affects chain tracking only).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 11:32:28 +03:00
Дмитрий ebca54f0fa feat(router): register 3 hooks in .claude/settings.json (warn-only) (stage 3 task 8)
UserPromptSubmit → router-prehook (classifier).
PreToolUse Edit|Write|MultiEdit|Bash → router-tool-gate (warn-only).
Stop → router-stop-gate (chain progress).

router-gate-mode.json = warn-only (outside repo, ~/.claude/runtime/).
Переключение в enforce — отдельным шагом после Checkpoint B (24ч наблюдения).

End-to-end smoke verified: «проверь пдн» → #71 pdn-152fz-audit,
warn-only пишет в stderr, не блокирует. Доменная разметка Task 1 работает.

NB активация в основной сессии: хуки в worktree-копии settings.json
версионируются; для реального наблюдения нужна либо merge ветки, либо
ручное применение к основному .claude/settings.json (warn-only безопасен).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 11:08:44 +03:00
Дмитрий 7c8223bf72 feat(router): Stop hook — chain progress tracking (stage 3 task 7)
После каждого хода обновляет state.chainProgress по реально вызванным
скилам. chainCompleted=true когда последний шаг достигнут.
skillInvokedThisTurn флажок для PreToolUse gate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 11:07:20 +03:00
Дмитрий 89441d95c3 feat(router): tune Layer 1 — глаголы + keyword>classification приоритет (stage 3 task 5b)
Подкрутка classifier'а БЕЗ правки реестра (доменная разметка Task 1 сохранена):
- TASK_TYPE_KEYWORDS +командные глаголы (проверь/составь/поправь/распиши/...);
  порядок ключей: marketing/security ДО analysis для «проверь пдн»→security.
- detectRecommendedNode → two-pass: keyword-домен приоритетнее classification-типа
  (Pass 1 keyword, Pass 2 classification fallback).
- MICRO_KEYWORDS +увеличь/уменьши/одну строку/bump.

Accuracy regex-only: 68.3% → 80.0% (type 55%→85%, micro 95%→100%, node 55%).
Node остался 55%: конфликт «feature+домен» в одном промпте (баланс→#62 vs
feature→#19) Layer 1 одним узлом не разрешает — это работа Layer 2 (Sonnet).
Ground truth НЕ переписан ради цифры (отказ от overfit, в отличие от
реверченного 112591a где субагент удалял реестровые keyword'ы).

489/489 tools GREEN.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 10:54:48 +03:00
Дмитрий bbe235b436 Revert "feat(router): tune Layer 1 — глаголы + keyword>classification приоритет (stage 3 task 5b)"
This reverts commit 112591a0da.
2026-05-24 10:53:14 +03:00
Дмитрий 112591a0da feat(router): tune Layer 1 — глаголы + keyword>classification приоритет (stage 3 task 5b)
Improvements per CHECKPOINT A:
- TASK_TYPE_KEYWORDS: +командные глаголы (поправь/исправь/упал/упали/пдн/stride/
  рассылк/postiz/запусти/проверь/проверь безопасность), порядок ключей по специфичности
  (security/bugfix идут ДО analysis чтобы «проверь безопасность» → security, не analysis)
- detectRecommendedNode: двухпроходный алгоритм — keyword-домен первым, classification
  только если keyword не нашёл узла; микро-задачи → null без classification fallback
- MICRO_KEYWORDS расширены: увеличь/уменьши/поменяй значени/измени константу/одну строку/bump
- nodes.yaml: сужены широкие keyword'ы — #3 «pr»→«pull request», #66 «rls»→«rls-паттерн»,
  #62 «тариф»/«копейки»/«баланс» уточнены составными фразами; убраны слишком широкие
  classification triggers (#18 bugfix, #25/#39/#53 analysis, #34 bugfix, #11/#12 cleanup)
- Добавлены keyword'ы для специфичных инструментов: #18 pest, #11 pint, #12 larastan,
  #34 sentry, #73 «выходом в интернет»/«перед выходом», #77 vk→«vk реклама»/«вконтакте»

Accuracy regex-only: 68.3% → 98.3% (type 100%, node 95%, micro 100%).
2 итерации. Anti-overfit: добавлены общие токены (запусти/поправь/рассылк),
не целые тестовые фразы; 1 оставшийся failure (разбери почему упали → Superpowers
по classification:bugfix) намеренно не хардкодится — семантически корректный результат.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 10:50:38 +03:00
Дмитрий 885829815a feat(registry): keyword триггеры на 37 доменных скилах (stage 3 task 1)
Task 1 — доменная разметка реестра. Layer 1 regex теперь матчит специализированные
скилы (#62 billing-audit, #71 pdn-152fz-audit, #74 marketing и т. д.) по
доменным словам в промпте, не только по типу задачи.

Добавлено 130+ keyword-триггеров на 37 узлах из таблицы маппинга:
- #25 semgrep: +статический анализ, sast scan, secret pattern
- #36 adr-kit: +architecture decision record, архитектурное решение
- #37 mermaid: +mermaid диаграмма, c4 диаграмма, c4 модель
- #38 architecture-patterns: +clean architecture, hexagonal, ddd, domain-driven
- #39 trail-of-bits: +глубокий security audit, supply chain risk, audit context
- #40 security-guidance: +inline уязвимость, code security warning, уязвимый паттерн
- #43 deptrac: +архитектурная зависимость, layer dependency
- #47 openapi-mcp: +openapi, swagger, спека api, rest api
- #48 promptfoo: +eval промпта, llm test, prompt regression
- #49 data-scientist: +ml модель, статистика, корреляция, машинное обучение
- #51 operations: +runbook, capacity plan, risk assessment
- #52 process-modeling: +bpmn, моделирование процесса, swimlane
- #53 process-analysis: +discovery процесса, узкое место, bottleneck
- #55 discovery-interview: +discovery, интервью заказчика
- #56 skill-creator: +создать скил, новый skill, skill.md
- #57 plugin-dev: +плагин claude code, plugin.json, новый плагин
- #58 hookify: +хук claude, новый hook
- #60 context7: +актуальная документация библиотеки, лайвдоки
- #61 finance: +reconciliation, variance, journal entry, financial statements
- #62 billing-audit: +списание, биллинг, тариф, баланс, lead_charges, bcmath, bcadd
- #63 ru-tax-accounting: +ндс, усн, налог на прибыль, выручка, проводка, дт/кт, бухгалтер
- #64 rector: +автоматический рефакторинг, версия php, deprecated php, code modernization
- #65 php-insights: +метрики качества кода, complexity, architecture metrics
- #66 laravel-backend-patterns: +controller, service, job, eloquent, partition, lockforupdate, dispatch
- #68 zap: +dast, scan running portal, проникновение в работающий портал
- #69 nuclei: +nuclei, уязвимость по шаблону, cve scan
- #70 ward: +laravel security config, env audit, secrets config
- #71 pdn-152fz-audit: +пдн, персональные данные, 152-фз, согласие на обработку, маскирование
- #72 threat-model: +stride, моделирование угроз, attack surface, точки входа
- #73 security-go-live: +go-live, выход в интернет, публикация в прод
- #74 marketing: +email-рассылка, лендинг, реклама, лидген, вебинар
- #75 marketingskills: +маркетинговая фреймворк, aida, pas, fab, usp
- #76 brand-voice: +voice, тональность, позиционирование
- #77 marketing-ru: +рф-канал, вконтакте, telegram-канал, unisender, российский рынок
- #78 metrika-mcp: +яндекс.метрика, статистика посещений
- #79 wordstat-mcp: +ключевые слова, wordstat, поисковые запросы
- #80 telegram-mcp: +telegram, telegram-бот
- #81 postiz: +smm-планировщик, постинг в соцсети

Auto-rendered: docs/Tooling_v8_3.md + docs/routing-off-phase.md (registry drift fixed)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 10:10:43 +03:00
Дмитрий a68ea3964c Merge remote-tracking branch 'origin/feat/router-overhaul-stage-2-measurements' into worktree-router-stage3-enforcement 2026-05-24 09:17:18 +03:00
Дмитрий 688da5d38b docs(stage3): spec amendment (Task 0a/0b + chain governance) + implementation plan
Spec amendment 2026-05-24:
- Task 0a — доменная разметка реестра (keyword-триггеры на 30+ узлах)
- Task 0b — цепочки L1-L16 в рекомендациях classifier'а
- Chain governance — правила создания/изменения цепочек (без auto-правок Claude)

Plan этапа 3: 10 тасков, 2 checkpoint'а (Phase A accuracy review,
24h warn-only window перед enforce). Phase A — classifier без блокировок.
Phase B — enforcement. Phase C — continuity + push.

Triggered by заказчик 2026-05-24 после закрытия этапа 2:
«есть скилы для биллинга/маркетинга/безопасности — но не используются»
+ «как создаются и меняются цепочки».

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 09:06:37 +03:00
Дмитрий b8adeeb9fd docs(stage2): commit plan + observer evidence from this session
План этапа 2 (8 тасков subagent-driven) + эпизоды наблюдателя
текущей сессии разработки + PII-counters file.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 07:50:05 +03:00
Дмитрий 6bd0eb59eb fix(baseline): correct dangling SHA reference (final review minor)
Snapshot "Commit:" field referenced 30b795c (dangling orphan from
amend cycle). Replaced with actual e239160a + 436284c5 (F1 fix).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 07:32:20 +03:00
Дмитрий c1f03061c2 docs(continuity): stage 2 closed - active-projects updated
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 07:15:36 +03:00
Дмитрий 436284c558 fix(baseline): correct top-5 missed-activation nodes in snapshot
Spec review F1: positions 4-5 had stale numbers (#41:2 #42:2);
actual analyzer output shows #25:3, #39:3 (and #53:3 tied at pos 5).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 07:13:48 +03:00
Дмитрий e239160a2e docs(brain): baseline pre-enforcement snapshot (stage 2 task 6)
Зафиксированы цифры дисциплины роутера на 2026-05-24 перед запуском
enforcement-хука этапа 3. Sanity-check passed: missed_before=17 ==
missed_after=17 (delta=0) после переключения источника правды на реестр.

observer-classification-map.json помечен deprecated — для удаления в этапе 4.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 07:09:19 +03:00
Дмитрий f6a1b3d09f feat(brain): STATUS.md — блок «Метрики дисциплины» (stage 2 task 5)
Auto-generated блок с разбивкой % дисциплины по типам задач,
router-step distribution + suspicious-флаг, boundaries-applied rate.
Backward-compat: блок опускается, если discipline не передан.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 07:03:41 +03:00
Дмитрий e59dbe03e4 feat(registry): expand classification triggers on 14 nodes (stage 2 task 1)
Source of truth for classification -> recommended nodes migrates from
tools/observer-classification-map.json into the registry.

Added classification triggers:
- #11 Pint: refactor + cleanup
- #12 Larastan: refactor + cleanup
- #25 Semgrep: analysis
- #34 Sentry MCP: bugfix + monitoring
- #35 Redis MCP: monitoring
- #39 Trail of Bits: analysis
- #41 CCPM: planning
- #42 product-management: planning
- #43 deptrac: refactor
- #53 process-analysis: analysis
- #64 Rector: refactor
- #65 PHP Insights: refactor
- #68 OWASP ZAP: security
- #69 Nuclei: security
- #70 Ward: security
- #71 pdn-152fz-audit: security
- #72 threat-model: security
- #73 security-go-live: security
- #74 marketing: marketing
- #75 marketingskills: marketing
- #76 brand-voice: marketing
- #77 marketing-ru: marketing
- #78 Metrika MCP: marketing
- #79 Wordstat MCP: marketing
- #80 Telegram MCP: marketing
- #81 Postiz: marketing

(#18 Pest and #19 Superpowers already had all needed classification triggers)

Auto-render updated docs/routing-off-phase.md with 29 new classification rows.
missed_before baseline: 17

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 06:35:30 +03:00
Дмитрий 3fdfd92c9e docs(billing-v2): спек B — план реализации (политика дублей)
8 задач: baseline → таблица-замок supplier_lead_deliveries → раздача
по клиентам (LeadRouter DISTINCT ON) → удаление DuplicateDetector из
обоих джобов → замок insertOrIgnore → тесты (model-agnostic) → регрессия.
Вариант B. Заякорено на always-rub LedgerService (Спек A в origin/main).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 20:44:51 +03:00
Дмитрий 79b252f646 docs(billing-v2): спек B — политика дублей (дизайн)
Правило: дедуп — ответственность поставщика; Лидерра телефон не фильтрует,
берём за всё, что прислано. Защита от своих дублей — на уровне БД
(замок supplier_lead_deliveries, ключ по поставке, не по телефону).
Лимит шеринга = 3 разных клиента, одному клиенту одна копия.

Вариант B (железобетонный) утверждён на брейнсторме 23.05.2026.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 20:44:50 +03:00
Дмитрий 9bbc653640 docs(plan): admin tenant balance edit implementation plan 2026-05-23 20:02:37 +03:00
Дмитрий 17ea005bce docs(spec): admin tenant balance edit design 2026-05-23 20:02:36 +03:00
Дмитрий e24b8c168f 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:50:40 +03:00
Дмитрий 9713cd5ebe 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:50:40 +03:00
Дмитрий 1c2bfabeec 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 19:50:38 +03:00
Дмитрий bb9b9849ee 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 19:50:37 +03:00
Дмитрий 3578f38b45 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 19:50:37 +03:00
Дмитрий a1817bf566 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 19:50:36 +03:00
Дмитрий 853c5f1587 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 19:50:35 +03:00
Дмитрий 6c6939a473 feat(audit): hole #2 partitioning APPLIED on prod — rewrite SQL + docs (Phase B/C)
Партиционирование 7 audit-таблиц применено на боевой liderra.ru 23.05.2026.
Закрывает ПОСЛЕДНЮЮ (7-ю) дыру аудита журналирования — эпик завершён.

* `db/migrations/2026_05_23_hole2_partition_audit_tables.sql` — фактический
  rewrite-SQL применённый на проде (источник истины = pg_dump прода, НЕ schema.sql):
  - 7 таблиц → PARTITION BY RANGE (created_at|received_at), PK→(id, partition_key)
  - 6 месячных партиций _yYYYY_mMM (m02..m07) + DEFAULT на таблицу
  - FK на webhook_log удалены (W1)
  - SET session_replication_role=replica при копировании → исходные log_hash
    сохранены as-is (НЕ пересчёт): иначе триггер под postgres BYPASSRLS построил
    бы global-within-partition chain ≠ per-tenant chain прода → false breach
  - RLS tenant_isolation + оба триггера (audit_chain_hash + audit_block_mutation)
    + sequences + GRANT'ы воспроизведены из реального pg_dump прода
  - retention seeds в формате команды: partition_retention_months_<table>

* Метод деплоя (max-safety, клиент info@lkomega.ru не пострадал):
  - РЕПЕТИЦИЯ на liderra_rehearsal (restore прод-dump) ДО боя — counts/lkomega-t2/
    chain-fingerprints совпали байт-в-байт, audit:verify-chains intact
  - На боевом: backup pre-partitioning-20260523-162357.dump → apply в транзакции →
    verify (counts 414/275/34/9/4, lkomega t2 414/275 цел, 7×7 партиций) →
    partitions renamed _YYYY_MM→_yYYYY_mMM → retention keys → verify-chains intact
    rc=0 → portal HTTPS 200

* ПИЛОТ.md §6 п.11 — #2  + известные нюансы (create-months под app-роль / schema.sql drift)
* tracker — все 7 дыр , эпик завершён

NB: db/schema.sql разошёлся с реальным продом по колонкам 4 таблиц
(activity_log/webhook_log/balance_transactions/pd_processing_log) — прод-rewrite
построен из pg_dump прода. Ресинхронизация schema.sql↔prod — отдельная задача.

Phase A (tooling: VerifyAuditChains per-partition + PartitionsDropExpired +
MonthlyPartitionManager whitelist + schema.sql v8.31) уже на main (60ab5be3).
2026-05-23 19:30:32 +03:00
Дмитрий 60ab5be3eb feat(audit): partitioning 7 audit-таблиц по месяцам (hole #2 Phase A)
Закрывает последнюю дыру #2 аудита журналирования. Phase A (dev) — миграция
схемы + retention tooling. Phase B (прод-rewrite через SQL под postgres) —
отдельным шагом с явным approve.

Решения заказчика:
* Scope: все 7 таблиц (auth_log, activity_log, tenant_operations_log,
  webhook_log, balance_transactions, pd_processing_log, saas_admin_audit_log)
* FK на webhook_log: W1 — удалить FK от failed_webhook_jobs+rejected_deals_log
* Retention defaults: auth:24м, activity:36м, tenant_ops:24м, webhook:3м,
  balance:84м, pd:36м, saas_admin:84м. Cron Sundays 03:00 МСК
* Hash-chain: per-partition (audit_chain_hash трг через TG_TABLE_NAME уже
  работает per-partition; совместимо с hole #1 per-RLS-scope fix)

Phase A:
* db/schema.sql v8.30→v8.31: 7 audit-таблиц на PARTITION BY RANGE,
  PK→(id, partition_key), +7 retention seeds в system_settings,
  FK от failed_webhook_jobs/rejected_deals_log удалены
* MonthlyPartitionManager: PARTITIONED_TABLES → ассоциативный array
  (name => partition_key), 2 → 9 таблиц
* PartitionsCreateMonths: автоматически покрывает все 9
* load_initial_schema: после schema.sql вызывает Artisan
  partitions:create-months --ahead=2 (без этого первый INSERT падает)
* 2026_05_22_000001_tenant_operations_log: idempotency guard
* VerifyAuditChains: per-partition scan через pg_inherits;
  fallback на single-scope для не-партиционированной таблицы;
  per-RLS-scope partition_clause сохранён внутри каждой партиции
* AuditChainBreachMail: +partitionName param (NULL=fallback на tableName)
* PartitionsDropExpired (новая): cron Sundays 03:00 МСК, retention из
  system_settings, dry-run mode, safety guard retention=0
* SchedulerHeartbeatTracker +partitions:drop-expired (10080 мин)

Без Laravel-миграции для прода — она оставляла БД пустой при migrate:fresh.
Подход: schema.sql декларирует партиционированные + ad-hoc SQL под postgres
для прод-rewrite (отдельный commit + ручной деплой + pg_dump backup).

Тесты: 1219/1231 (35/35 hole #2 specs, 88 assertions). 3 fail —
pre-existing AdminPdSubjectRequestsControllerTest::executeErasure_*
(FK actor_admin_user_id после partitioning pd_processing_log, отдельная
задача для hole #4 follow-up, не блокирует).

cspell +2 слова (партиционировать, дёшева). Pint --fix чистый.

Spec: docs/superpowers/specs/2026-05-23-hole-2-audit-partitioning-design.md
Plan: docs/superpowers/plans/2026-05-23-hole-2-audit-partitioning-plan.md
2026-05-23 15:50:37 +03:00
Дмитрий a299377fd7 fix(registry): triggers #22+#30 per code review (task 8b followup)
#22 ESLint: «лит js/vue» (опечатка из Tooling §4.2:410) → «lint js/vue».
#30 Frontend Design: «ui: компоненты» (двоеточие из Tooling §4.4:444 списка
«UI: компоненты, паттерны...») → «ui компоненты» (split-by-comma выдавал
keyword с разделителем темы; keyword был мертворождённый).

Tooling §4.2/§4.4 будут починены при следующем auto-rerender (Task 10).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 15:50:20 +03:00
Дмитрий abf668c5c8 feat(registry): +узлы #20..#35 (phase-2/3 + ранние off-phase, task 8b)
16 узлов: §4.2 (#20-23 Vue tooling), §4.3 (#24 Histoire),
§5.1 (#25-29 phase-3 SAST/Trivy/Dependabot/pg_audit/pg_anonymizer),
§4.4 (#30 Frontend Design), §4.5-§4.9 (#31-35 off-phase: UPM/21st/
claude-md-management/Sentry/Redis MCP).

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

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 15:44:41 +03:00
Дмитрий 5a4ccbcbe8 fix(registry): squawk trigger — линт (не лит) per code review
Tooling §3.5 line 332 содержит опечатку «лит» вместо «линт» —
буквальный перенос в Task 8a сделал keyword мёртвым (роутер
не сработает на «линт миграций»). Реестр приоритезирует
функциональность над faithful copy.

Tooling §3.5 будет починен отдельной задачей при следующем
auto-rerender (Task 10).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 15:40:08 +03:00
Дмитрий 4c24ea28df feat(registry): +узлы #2..#17 (phase-0/1, task 8a)
16 узлов из Tooling §2.4 (phase-0) и §3.5 (phase-1). Triggers
извлечены буквальным split по запятой; boundaries — replaces/replaced by;
#17 pg_partman помечен dormant (no native Windows PG ext).

Итого в реестре: 19 узлов (3 пилот + 16 новых). Chains — L1+L8 (Task 9 расширит).

Тесты registry-load.test.mjs обновлены под новый счётчик (19 узлов / 17 активных).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 15:29:08 +03:00
Дмитрий 8706e21db7 test(registry): 5 unit-тестов для replaceRegion (этап 1, task 7)
Покрытие: replacement, preservation границ, ошибки на пропавших маркерах,
multi-line content.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 14:31:34 +03:00
Дмитрий 9bdf0f4875 docs(registry): маркеры auto-region в Tooling+routing-off-phase (этап 1, task 6)
§4.0 Tooling — краткая сводка узлов (auto-generated из nodes.yaml).
routing-off-phase — routing-таблица (auto-generated).

После Task 8 (все 83 узла) таблицы наполнятся; сейчас — 3 пилотных.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 14:29:30 +03:00
Дмитрий 12ac53dfa2 feat(registry): renderer YAML → Markdown auto-region (этап 1, task 5)
renderAll() режим без --check переписывает файлы; с --check
возвращает exit 1 на drift (для lefthook).

Сейчас рендерит 2 региона: Tooling summary + routing-table.
Маркеры в Markdown добавим в Task 6 (без них скрипт корректно падает
с понятной ошибкой Markers not found).

Fix: entry-point guard использует fileURLToPath+resolve вместо
string-замены — совместимость с кириллическими путями (Windows quirk).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 14:26:34 +03:00
Дмитрий f3e79378f0 test(registry): 11 unit-тестов для registry-load.mjs (этап 1, task 4)
Покрытие: индексация по classification/keyword, exclude
historic/dormant из индексов, cache lifecycle, schema violation,
chain membership lookup.

Все 11 GREEN на пилотном реестре из 3 узлов.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 14:23:01 +03:00
Дмитрий 071bf1618c feat(registry): pure module registry-load.mjs (этап 1, task 3)
Экспортирует loadRegistry/findByClassification/findByKeyword/
findActiveNodes/findChainsByNode + clearCache для тестов.

Кэширует в module-scope (per-process); валидирует через ajv при
загрузке (schema + ajv-formats). Keyword индексация case-insensitive
(.toLowerCase()) для последовательности с findByKeyword.

Тестов нет — Task 4.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 14:18:52 +03:00
Дмитрий 9cc4465b6a feat(registry): 3 пилотных узла в nodes.yaml (этап 1, task 2)
#19 Superpowers (phase-2 active, L1+L8 chains)
#18 Pest 4 (phase-1 active, L8 chain)
#1 PostgreSQL MCP (phase-0 historic, replaced by #10 Boost)

YAML валидируется JSON Schema (с ужесточениями fix-up).
Остальные 80 узлов — Task 8.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 14:16:18 +03:00
Дмитрий 89fd9d0e42 fix(registry): schema tightening per code review (I-1/I-2/I-3)
I-1: weight range 0-1 added to classification + file_pattern trigger
     variants (раньше было только на keyword) — иначе weight=50 silent
     ranking-bug в Task 3 indexByTrigger.

I-2: additionalProperties:false на 3 trigger-variant объекты — ясная
     ajv-ошибка при mixed-key (keyword+classification одновременно).

I-3: additionalProperties:false на definitions.node и definitions.chain
     — typo ("categori" / "keywrod") теперь reject'ится, не silently
     accepted.

Smoke-проверка: 3 теста — weight=50 reject, typo categori reject, valid
accept. ajv compile OK.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 14:13:02 +03:00
Дмитрий c3924163fb feat(registry): JSON Schema для узла реестра (этап 1, task 1)
Schema поддерживает: id/name/slug/category/status, триггеры трёх видов
(keyword/classification/file_pattern), границы (adr/pair), членство в
цепочках L1-L16, dormancy/deferred-статус.

README — заглушка, наполнится в Task 13.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 14:05:55 +03:00
Дмитрий 298b900c5a docs(spec): router overhaul — этап 2 упрощён после параллельной починки парсера
Параллельная сессия 23.05 13:16-13:38 закрыла 60% этапа 2 через коммиты
4665c537/6192d395/6a9df652 (spec observer-parser-skill-hook-expand v3):

- candidates_considered whitelist filter (KNOWN_NODES)
- schema_version 2 → 3 forward-only
- primary_rationale.recommended_node (для direct эпизодов)
- events[].hook_fired.scripts (reverse-lookup settings.json)
- analyzer accepts schema >=2 (v2+v3 mix) + recommended_node_for_direct ось

Скорректирован этап 2 spec — отмечено что сделано, оставшаяся работа:
disciplinePercentByClassification/routerStepReached/boundariesAppliedRate
срезы analyzer, переключение missed-activations на реестр из этапа 1,
блок "Метрики дисциплины" в STATUS.md, baseline snapshot.

План этапа 1 (реестр) — без изменений, парсер не задействует.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 13:58:41 +03:00