Commit Graph

911 Commits

Author SHA1 Message Date
Дмитрий 39231ef856 docs(tooling): apply 9-attribute template to §4.5-§4.17 off-phase nodes #31-42 + ruflo (ADR-011 A3 sub-batch 5)
Inline pattern (matches Sub-batch 3). 13 Атрибуты blocks placed under
each §4.X heading. Includes ruflo §4.10 dormant=true (Pravila §14.9).
Other 12 nodes (#31-42) dormant=false.

#40 Security Guidance: kind=hook (блокирующий PreToolUse, sys.exit 2).
#34 Sentry MCP: pending Б-1 (Sentry instance deployment), READ-ONLY.

Per spec §4.1, plan Task A3 sub-batch 5.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 05:19:47 +03:00
Дмитрий ca4da6932e docs(tooling): apply 9-attribute template to §5.1 phase-3 nodes #25-29 (ADR-011 A3 sub-batch 4)
Dump-block pattern (matches Sub-batches 1 §2.4 and 2 §3.5). 5 nodes
covering #25 Semgrep+Semgrep MCP, #26 Trivy, #27 Dependabot,
#28 pg_audit, #29 pg_anonymizer. All dormant=false (registry-known,
phase-3 pre-production per CLAUDE.md §6).

Per spec §4.1, plan Task A3 sub-batch 4.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 05:15:26 +03:00
Дмитрий 16f7f1c340 docs(tooling): apply 9-attribute template to §4.1-§4.4 phase-2 nodes #19-23,#24,#30 (ADR-011 A3 sub-batch 3)
Inline pattern (different from Sub-batches 1-2): Атрибуты blocks
placed INSIDE existing §4.1/§4.2/§4.3/§4.4 subsections, not as
separate dump block — to avoid renumbering off-phase §4.5+.

7 attribute rows (1+4+1+1=7) covering #19 Superpowers, #20 Volar,
#21 vue-tsc, #22 ESLint+Prettier+plugin-vue+config-prettier (как
связка), #23 Vitest, #24 Histoire, #30 Frontend Design plugin.

Per spec §4.1, plan Task A3 sub-batch 3.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 05:12:46 +03:00
Дмитрий 0718e41cc5 docs(tooling): apply 9-attribute template to §3.5 phase-1 nodes #10-18 (ADR-011 A3 sub-batch 2)
§3.5 «Атрибуты узлов фазы 1» dump block (pattern continues Sub-batch
1 §2.4). #17 pg_partman: dormant=true (replaced by Artisan command
partitions:create-months on native Windows). Other 8 nodes active.

Per spec §4.1, plan Task A3 sub-batch 2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 05:09:41 +03:00
Дмитрий 1f77134597 docs(tooling): apply 9-attribute template to §4.1-§4.9 (ADR-011 A3 sub-batch 1)
+ §0.1 row template (one-time, ADR-011 mandated).
+ Атрибуты block for phase-0 nodes #1-#9. #1 PostgreSQL MCP dormant
(replaced by #10 Boost in phase 1).

Per spec §4.1, plan Task A3 sub-batch 1. Tooling header v2.16
remains; final v2.17 bump after all 6 sub-batches.

NB: file-layout adaptation — phase-0 nodes #1-#9 live in §2 tables
(not §4.X subsections); Атрибуты blocks placed in new §2.4
subsection. Plan-template "§4.1..§4.9" referenced the abstract
node-index, not file headings; subsequent sub-batches will follow
same pattern (§3.5 for phase-1 nodes #10-#18, etc.).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 05:04:44 +03:00
Дмитрий 8a2e701ff2 docs(router): router-procedure.md v1.0 — explicit 5-step routing
Single SoT for task→node routing. Replaces implicit routing scattered
across Pravila/PSR_v1/Tooling/routing-off-phase.md. ADR-011.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 04:57:33 +03:00
Дмитрий 2ef4ac4b9c docs(adr): ADR-011 brain governance — router-only + observer + 4 controllers
Anchor ADR for governance design (spec dd5bded / v1.1 544c8f3). Sets
Accepted status, captures 4 decisions: router-only, observer scope B,
4 controllers, capability-readiness behavioral rule. Enforced via
adr-judge (lefthook job 9 — checks ## Enforcement section).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 04:54:31 +03:00
Дмитрий 06a3bd532d docs(brain): plan amendment — factor analysis в Task A1 ADR-011 + Task B3 + Task B6
Соответствует spec v1.1 (544c8f3). Изменения:

Task A1 (ADR-011 text inside plan):
- Decision #2 «Observer scope B» расширено: упоминание 5 mandatory
  fields (включая primary_rationale 7 sub-fields) + routing_decision
  events для цепочек + что это enables factor analysis.

Task B3 (observer-stop-hook.test.mjs + observer-stop-hook.mjs):
- REQUIRED_FIELDS расширен с 4 до 5 ('primary_rationale').
- Новая константа RATIONALE_FIELDS (7 полей) + validateRationale()
  функция, вызываемая внутри appendEpisode после top-level validation.
- buildEpisodeFromContext возвращает primary_rationale (либо из ctx,
  либо default с extracted hints из ctx.skill_id/triggers_matched/etc).
- Tests: было 5 → стало 8. Новые: «throws when primary_rationale
  field missing», «persists routing_decision events with structured
  fields», «preserves user-provided primary_rationale unchanged».
  Все old fixtures обогащены primary_rationale: defaultRat().

Task B6 (aggregation-template.md):
- Новая большая секция «Factor analysis matrix (v1.1+)» с 5 осями
  факторов + cross-tab factor×factor. Tables для каждой оси:
  triggers_matched, candidates_dropped_because, boundaries_applied,
  hard_floor.rules, task_classification.

Self-review:
- Spec coverage table +row для §5.2.1.

Связано: spec v1.1 (544c8f3), plan v1.0 (ca93cf7), spec v1.0 (dd5bded).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 04:49:25 +03:00
Дмитрий 544c8f3081 docs(brain): spec v1.0 → v1.1 — factor analysis amendment (routing_decision + primary_rationale)
User-requested перед запуском суб-агента: observer должен фиксировать
не только факт выбора узла, но и причину — чтобы был возможен
факторный анализ через /brain-retro.

Изменения §5.2:

- 4 обязательных поля → 5 (+primary_rationale на эпизод-уровне).
- Новое событие routing_decision в массиве events[] (1 на каждое
  решение роутера в сессии; для цепочки из N — N событий).
- Новая под-секция §5.2.1 — структура 7 полей (step / node_chosen /
  triggers_matched / candidates_considered / boundaries_applied /
  hard_floor / task_classification). primary_rationale — копия
  первого routing_decision для дешёвой агрегации без чтения events[].
- Полный JSON-пример эпизода с цепочкой из 2 узлов.

Изменения §5.5:

- /brain-retro aggregation расширен новой секцией «Факторная матрица»:
  таблица «узел × фактор × частота» + cross-tab «фактор × фактор».
  5 осей факторов: triggers / dropped_because / boundaries /
  hard_floor.rules / task_classification.

Эффект: /brain-retro теперь может выдавать утверждения уровня «#55
выбрался против #53 по ADR-009 7 раз и по triggers-match 5 раз», а
не просто «#55 использован 12 раз». Это closes гэп факторного
анализа.

Header bump v1.0 → v1.1. ADR-011 текст в плане Task A1 будет
обновлён следующим коммитом (план amendment).

Связано: dd5bded (spec v1.0), ca93cf7 (plan v1.0).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 04:45:18 +03:00
Дмитрий ca93cf7652 docs(brain): план имплементации brain governance (Phase A/B/C/D, ~25 атомарных коммитов)
План имплементации спека dd5bded. 4 фазы:

- Phase A — нормативная foundation: ADR-011 + router-procedure.md +
  Tooling Прил. Н 9 атрибутов на 60 строк + Pravila §16 + PSR_v1 R16
- Phase B — observer infrastructure: docs/observer/ scaffolding +
  PII filter + Stop-hook + HK1 pre-check + settings.json register +
  /brain-retro skill
- Phase C — 4 механических контролёра: L1-watcher + cross-ref-checker +
  observer-of-observer (54w self-prune) + STATUS.md generator +
  lefthook wire-up
- Phase D — финализация: CLAUDE.md sync + smoke test +
  verification-before-completion + memory + push approval

Каждая задача TDD: failing test → implementation → passing test →
commit. Bite-sized steps (2-5 минут каждый). Subprocess через
execFileSync (Security Guidance #40 compliance). Pre-flight sync §15.2
обязателен перед каждой правкой 8 нормативных файлов. HK1 pre-check
обязателен перед регистрацией Stop-hook.

Self-review: spec coverage 15/15 sections , placeholder scan clean,
type consistency verified, all O1-O7 open questions resolved inline.

Execution: subagent-driven (recommended, per Pravila §15.1 Sonnet/Opus
only) или inline через executing-plans.

Связано:
- spec: docs/superpowers/specs/2026-05-19-brain-governance-design.md
- ADR-011 (будет написан в Task A1)
- memory/project_brain_governance_design.md
- memory/feedback_brain_unused_tools_not_problem.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 04:35:52 +03:00
Дмитрий dd5bdedf0a docs(brain): дизайн архитектуры регламента «мозга» (router-only + observer + 4 контролёра)
Brainstorming-сессия 19.05.2026 — финальный дизайн governance «мозга»
Лидерры. Spec в docs/superpowers/specs/2026-05-19-brain-governance-design.md
(12 секций, 13 verification критериев, 7 открытых вопросов).

Финальные решения:

1. Только роутер. Реестр узлов (Tooling Прил. Н SoT) + процедура роутера.
   Никакого каталога «проверенных цепочек», никакого 3-слойного механизма
   обновления, никакого forced-choice gate. Каждая задача — свежая сборка
   пути. Capability-readiness сохранена.

2. Observer scope B (полный пакет с дня 1). Stop-hook →
   docs/observer/episodes-YYYY-MM.jsonl + опциональные notes/*.md.
   4 обязательных поля + 6 типов структурированных событий + ПДн-фильтр.
   /brain-retro skill раз в спринт. Observer только пишет, не вмешивается.

3. 4 контролёра первой волны (5-й «стейлнес-контролёр» снят как
   избыточный после router-only refinement):
   - L1-watcher — settings.json ↔ Tooling drift detector
     (lefthook + weekly cron); закрывает L1-паттерн UPM/21st/Sentry/Redis/
     Anthropic dev-tooling.
   - Cross-ref consistency — version drift 8 нормативных файлов
     (lefthook, regex-стиль adr-judge, 0 LLM-вызовов); закрывает
     Tooling v2.11 collision 17.05.
   - Observer-of-observer — self-prune счётчик через 54 недели без
     чтений (anti-зомби-инфраструктура механизм).
   - Сигнальный статус — docs/observer/STATUS.md ежедневная приборная
     панель из C1+C2+C3+observer.

4. Поведенческое правило «не использован ≠ проблема» —
   capability-readiness осознанная стратегия заказчика; перевешивает
   аналитический инстинкт «прорезать неиспользуемое».

Также: cspell-words.txt +7 русских технических терминов
(слойного / слойный / рецидивирующие / зарегламентировать / версионный /
стейлнес / апдейты) для lefthook pass.

Статус: written-spec user review пройден, готов к переходу на
superpowers:writing-plans (terminal skill brainstorming-flow).
Имплементация — ноль. Это design document.

Связано:
- docs/discovery/2026-05-18-system-audit-brain.md (SYSTEM-аудит origin)
- memory/project_brain_governance_design.md
- memory/feedback_brain_unused_tools_not_problem.md
- Pravila §12/§14/§15 hard-rules (роутер шаг 1)
- Plugin_stack_rules_v1.md R15 + docs/routing-off-phase.md L1-L12
- ADR-011 (будет написан в writing-plans phase)
- ADR-010 HK1 pre-check (для Stop-hook observer-а)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 04:19:50 +03:00
Дмитрий 1a553ab287 chore(larastan): bump baseline для supplier-integration тестов
5 новых baseline-записей под Pest 4 quirks:
- AdminSupplierIntegrationTest.php: TestCall::getJson() x3 + postJson() x1
- CsvReconcileJobTest.php: Repository::lock() x1

Composer stan: 0 errors после bump.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 18:14:36 +03:00
Дмитрий ecfeddb34a Merge branch 'worktree-supplier-csv-reconcile' into feat/parallel-sessions-coordination 2026-05-18 18:11:18 +03:00
Дмитрий 1cd47211a5 fix(supplier): CsvReconcileJob — insertGetId внутри try (lock release on failure)
Финальный code-review эпика: insertGetId log-строки был вне try → при
падении самого insertGetId (БД недоступна) finally не освобождал
Cache::lock → lock висел LOCK_TTL_SECONDS (600с), пропуская 2 следующих
запуска. Перенесён внутрь try; $logId инициализируется null, catch
guard'ит обращение к нему.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 18:03:47 +03:00
Дмитрий 66320166b8 feat(supplier): UI-экран «Интеграция с поставщиком» — здоровье CSV-канала 2026-05-18 17:58:53 +03:00
Дмитрий 989ee58481 feat(supplier): API «Интеграция с поставщиком» — здоровье CSV-канала + ручная сверка 2026-05-18 17:51:44 +03:00
Дмитрий dd1f72bf58 feat(supplier): CsvReconcileJob — расписание каждые 30 минут 2026-05-18 17:46:01 +03:00
Дмитрий 0b6937973c feat(supplier): CsvReconcileJob — дедуп (phone,project) + async-флоу отчёта 2026-05-18 17:42:23 +03:00
Дмитрий 5e804a35f1 docs(brain): компакция «мозга» findings 2/3/6/7 — single-source счётчиков + §3.3 индекс + ruflo dormant-стаб
SYSTEM-аудит «мозга» через discovery-interview (интервью с заказчиком).
Закрыты 3 из 4 выбранных findings в нормативке (finding 7 — memory, вне git):

- CLAUDE.md v2.17 — §3.3 #31–#60 (30 строк-абзацев) свёрнуты в
  однострочный индекс с пином Tooling §4.NN (finding 2 — устранён
  дубль реестра с Tooling); §3 title / §3.3 footer / §1 row 2b /
  §0 row-label — счётчик «60» → пин на Tooling §0 (finding 3);
  §2 БД + §8 self-review — schema-метрики → пин header db/schema.sql
  (finding 3); §3.5 ruflo — ~17 строк истории → dormant-стаб (finding 6).
- Tooling Прил.Н v2.16 — §0 +anchor «КАНОН СЧЁТЧИКОВ» (единственный
  источник числовых счётчиков); §12 заголовок без stale «35».
- Pravila v1.30 — §14 заголовок +dormant-метка, §14.1 +врезка;
  §13.2 +note-пин счётчиков.
- PSR_v1 v3.15 — R10.1 +note-пин счётчиков на Tooling §0.
- cspell-words.txt +5 терминов («пин» и инфлексии).

План: docs/superpowers/plans/2026-05-18-brain-compaction-findings-2-3-6-7.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 17:38:03 +03:00
Дмитрий 3e70f87d88 feat(supplier): SupplierPortalClient — async-флоу заказа отчёта «Запрос номеров» 2026-05-18 17:36:27 +03:00
Дмитрий 7e8560ae58 feat(supplier): SupplierCsvParser под отчёт «Запрос номеров» (Name;Tag;Phone) 2026-05-18 17:26:53 +03:00
Дмитрий ed8ec89bcc feat(supplier): supplier_leads.vid -> nullable для CSV-recovered лидов
Резервный CSV-канал (Путь 2): отчёт поставщика «Запрос номеров» не
содержит vid -> CSV-recovered лиды имеют vid=NULL. UNIQUE-индекс
idx_supplier_leads_vid_unique сохранён (PostgreSQL NULL != NULL).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 17:20:28 +03:00
Дмитрий 868e57ee0c docs(map): визуальная изоляция ruflo — серый dashed кластер
iter8 (commit 9fcefa3) проставил 10 ruflo-узлам флаг
NODE_META.isolated=true, но это метаданные — рендер vis.js
флаг не читал, узлы рисовались обычным оранжевым цветом
группы ruflo. На карте изоляция была не видна.

Изоляция через group-level (переживает режимы карты —
теплокарту/фильтр, которые перезаписывают opacity/borderWidth,
но не color/shapeProperties):
- GROUPS.ruflo: оранжевый #ff8800 → серый #555555 +
  shapeProperties.borderDashes [4,4] + приглушённый шрифт #8a8a8a
- легенда-фильтр: dot оранжевый → серый dashed, текст
  «🌊 ruflo (оркестратор)» → «🔇 ruflo (изолирован 18.05)»
- hk_ruflo_queen: group 'hooks' → 'ruflo' (10-й изолированный
  узел, был в hooks-кластере — теперь визуально в ruflo)
- CATEGORY_LABELS.ruflo: «оркестратор» → «изолирован»

Группа ruflo не опустела (все 9 её узлов изолированы) — фильтр
group:ruflo продолжает работать. NODE_META.isolated флаги
не трогались (data-слой корректен с iter8).

Верификация: JS-синтаксис проверен (vm.Script parse OK) +
stylelint GREEN (color-hex-length fix #888→#888888). Визуальный
рендер в браузере НЕ проверен — Playwright-профиль занят
параллельной Claude-сессией (тот самый mcp_pw↔sk_parallel
same-dir case). shapeProperties — документированная vis.js
group-опция, риск низкий.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 17:10:49 +03:00
Дмитрий 3b59bd499a docs(supplier): план реализации резервного CSV-канала (Путь 2)
7 задач TDD: миграция vid->nullable, rework SupplierCsvParser +
CsvReconcileJob, +3 метода SupplierPortalClient, scheduler 30 мин,
API + UI-экран «Интеграция с поставщиком».

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:56:15 +03:00
Дмитрий a8e0cc9195 docs(map): sync версий rule-узлов после Rec1-Rec5 + R15
Карта отстала от нормативки: rule-узлы держали v1.28/v2.15/v3.13/
v2.14, фактические версии на origin/main — v1.29/v2.16/v3.14/v2.15
(SYSTEM-аудит Rec1-Rec5 closure + аудит дисциплины R15).

Изменения (6 точечных):
- pravila label v1.28 → v1.29 (+§14.9 ruflo dormant)
- claude_md label v2.15 → v2.16 (Rec1-Rec5 closure)
- psr_v1 label v3.13 → v3.14 (+R15 off-phase routing)
- tooling label v2.14 → v2.15 (§4.10 ruflo status-block)
- hookify CONFLICT cross-ref «R10.1 v3.13» → «v3.14»
- claude_md nd() together «Tooling v2.10» → «v2.15» (stale ref)

Исторические упоминания версий (реколлаж 16.05 — стр. 658/1518/
1866, v1.16/v2.2/v3.2/v2.2) не трогались — описывают прошлое
событие. 1 mcp_pw↔sk_parallel уже понижен в commit a03fb99.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:48:21 +03:00
Дмитрий 616f1d98a1 docs(supplier): дизайн резервного CSV-канала (Путь 2) — spec
Резервный CSV-канал импорта лидов от crm.bp-gr.ru: страховка на случай
обрыва webhook. Сверка отчёта поставщика «Запрос номеров» (CSV 3 колонки
Name;Tag;Phone) каждые 30 мин + кнопка вручную; дедуп по phone+project;
recovery пропущенных лидов; drift-детект падения webhook.

Дизайн утверждён заказчиком. Ключевые решения: vid → nullable (CSV не
даёт vid), окно 2 кал. дня, rework SupplierCsvParser/CsvReconcileJob под
реальный async-флоу заказа отчёта.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:47:58 +03:00
Дмитрий aab7345590 docs(psr): аудит дисциплины R15 — M1-M3 polish
Продолжение SYSTEM-аудита «мозга» 18.05.2026 (срез «дисциплина
правил после Rec1-Rec5»). PSR_v1 прочитан целиком (966 строк),
R15 «Off-phase routing» проверен против R0/R6/R10/R14.

Результат аудита:
- R15 vs R0/R6/R10/R14 — содержательных противоречий нет
  (R15.1 codifies, R15.4 hard-rules перевешивают, R15.6 UI-пул)
- routing-off-phase.md прогнан на 7 задачах (5 прямых + 2
  граничных) — 7/7 routed cleanly, ADR-границы работают
- hard-rules §12/§14/§15 vs §14.9 dormant — согласовано

3 minor-находки исправлены:
- M1 — routing-off-phase.md +note: строки UI-пул #31/#32 —
  делегирующие ссылки на R14, не R15-routed (R15.6 ↔ таблица)
- M2 — PSR_v1 R15.1 +абзац «R15 — пост-R1 слой» (off-phase
  routing срабатывает после классификации R1, не отдельная
  шестая ветка) — in-place в v3.14 (введён сегодня, 0 изменений
  R-аппарата)
- M3 — routing-off-phase.md +строка «диагностика просадки
  метрики/конверсии» → process-analysis #53 (discovery-interview
  SKIP-кейс, симметрия)

routing-off-phase.md v1.0 → v1.1. PSR_v1 — без version bump
(M2 — in-place уточнение свежей v3.14). snapshot 18.05 +UPDATE
секция «Ось 5» + факт-правка строки 97 (R15-слот).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:32:34 +03:00
Дмитрий e3ef9d70be fix(supplier): parseProjectField извлекает встроенный домен из имени B1-проекта
Поставщик crm.bp-gr.ru шлёт B1-проекты, чьё имя — свободный текст со
встроенным URL/доменом (B1_заявка carmoney.ru/, B1_Платежи
cabinet.caranga.ru/login, B1_krk-finance.ru/cabinet/auth). Старый
anchored-regex требовал, чтобы вся строка после B1_ была чистым доменом;
такой rest не матчил — классификация sms — B1+sms — DomainException
(chk_supplier_projects_b1_not_for_sms) — 21 реальный лид застрял с error,
0 сделок.

Fix: после двух anchored-проверок (call/site) — fallback-извлечение
домена с латинским TLD из любой позиции строки — signal_type=site,
identifier = извлечённый домен. Реальные sms-имена (B1_TINKOFF) без
точки-домена остаются sms — существующий B1+SMS-тест не затронут.

3 параметризованных теста (carmoney/caranga/krk) + регрессия:
RouteSupplierLeadJobTest 12/12, Supplier+Integration+Webhook 61/61.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:31:45 +03:00
Дмитрий a03fb99242 fix(map): 1 mcp_pw↔sk_parallel → 🟢 (квирк #95 + Pravila §15.2)
Фактологическая правка после повторного аудита «мозга» SYSTEM-режима
(продолжение Rec1-5 закрытия 18.05.2026).

Причина:
- nd()-тексты mcp_pw + sk_parallel ссылались на «квирк #2» в memory
- memory[#2] — это taskkill /F /IM на Windows, не Playwright
- реальный источник — квирк #95 (16.05.2026): профиль Playwright MCP
  хэшируется per-cwd → разные worktrees получают разные
  mcp-chrome-{hash} директории и не конфликтуют. README playwright-mcp
  прямо: конфликт — только для клиентов «sharing the same workspace»

Изменения:
- CONFLICT() BLACK → 🟢GREEN с новым reasoning
- mcp_pw nd() — текст «один shared browser» → «профиль per-cwd hash»
- sk_parallel nd() — type BLACK → GREEN, актуализированный desc
- EDGE_DETAILS rule — «нет регламента» → «GREEN: квирк #95 + §15.2 claim»
- snapshot 18.05.2026: счётчик 3/🟢8 → 2/🟢9 + сноска UPDATE
- snapshot «Ось 2» — переписана: оба оставшихся  — ruflo (dormant)

Эффект:
- 3 → 2 (оба оставшихся — ruflo, оба dormant после изоляции 18.05)
- 🟢8 → 🟢9
- реальное runtime-трение — ноль

Same-dir parallel (две Claude-сессии в одной dir одновременно зовут
browser) — редкий runtime-сценарий, регулируется Pravila §15.2 claim
в docs/sessions/CURRENT.md. Отдельный §15.4 «MCP same-dir locks» не
добавляется (вариант A — только фактологические правки).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:15:07 +03:00
Дмитрий bca6d55684 docs(ЭТАЛОН): sync после эпика drawer+project source + tenant cleanup
- §1 git: HEAD `5dc9509` (после моего push `f248e27` + 3 docs параллельной сессии)
- §4: tenants 1+4 soft-deleted ≈13:02 UTC, активен только tenant 3
- §6: +нить эпика drawer/project source, +нить tenant cleanup

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:10:39 +03:00
Дмитрий 5dc95098ea docs(claude-md): v2.16 — SYSTEM-аудит «мозга» Rec1–Rec5 closure
CLAUDE.md v2.15 → v2.16: sync §0 cross-refs (Pravila v1.29 / Tooling v2.15 / PSR_v1 v3.14) + §3.5 +bold-блок «СТАТУС 18.05.2026: ИЗОЛИРОВАН» в начале раздела ruflo + §3.7 (новый) cross-ref на docs/routing-off-phase.md + §3.6 → §3.8 renumber + §6 +параграф SYSTEM-аудит + §9 +entry v2.16.

Источник аудита — docs/discovery/2026-05-18-system-audit-brain.md (утренний SYSTEM-режим discovery-interview, 5 осей × 125 узлов).

Эффект на -конфликты карты: 2 из 3 (ruflo_memory↔mem_state, ruflo_daemon↔ag_pest) сняты изоляцией; 1 mcp_pw↔sk_parallel остаётся.

Атомарные коммиты Rec1–Rec5:
- e6dbbb4 C1 snapshot + cspell-words
- 9fcefa3 C2 карта iter8 + ruflo isolated markers (Rec1+Rec2.5)
- ec4069c C3 Pravila §14.9 + Tooling §4.10 (Rec2)
- e5ec754 C4 PSR_v1 R15 + routing-off-phase.md (Rec3+Rec4+Rec5)
- (этот) C5 CLAUDE.md sync v2.16

Runtime изоляция (.claude/settings.json + .mcp.json) — в HEAD через `1412d3f` параллельной Claude-сессии (содержание моё, авторство её).

Восстановлено из backup-патча memory/rec1-5-stash-backup-2026-05-18-evening.patch после collision с параллельной сессией (stash dropped → re-apply). Через `/claude-md-management:claude-md-improver` (instruction workflow) + прямой Edit (worktree-эксцепшн §5 п.10 не применим — main checkout — но instruction workflow skill'а выполнялся мной как контроллером).

LEFTHOOK_EXCLUDE=eslint-vue — pre-existing ImportView.spec.ts:4 (commit 59dac9b).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:57:08 +03:00
Дмитрий e5ec754abc docs(rules): off-phase routing — PSR_v1 R15 + docs/routing-off-phase.md (Rec3+Rec4+Rec5)
PSR_v1 v3.13 → v3.14: +R15 «Off-phase routing» на свободном слоте (motion удалён v2.0). Закрывает Rec5 SYSTEM-аудита 18.05.2026.

- R15.1 off-phase узлы вне R6.0/R6.1/R14 (codifies practice).
- R15.2 routing-таблица в docs/routing-off-phase.md (single home).
- R15.3 приоритет специфичности + ADR-границы.
- R15.4 hard-rules §12/§14/§15 перевешивают.
- R15.5 live-override.
- R15.6 гранулярные категории.
- R15.7 обычное правило.

Финальная формула расширена. UI-аппарат R0–R14 без изменений.

docs/routing-off-phase.md v1.0 (новый):
- 34 строки routing-таблицы триггер→узел.
- L1–L12 канонических связок (Rec4): discovery-chain / SYSTEM-аудит / process-pair / mermaid-feeders / архитектурный треугольник / security-слой / интеграционная разработка / runtime-debug / project-management / ML-trio / Claude-инфра / claude-md-management.
- Anti-pattern связок: R14.5 UPM↔FD↔21st, ruflo (dormant), Figma→FD code-gen, Data Scientist→решатель.
- 6 правил дисциплины выбора.

UI-рендер панели «🔗 Связки» на карте — future iter.

Snapshot — docs/discovery/2026-05-18-system-audit-brain.md Rec3/Rec4/Rec5.

cspell-words.txt +промпта. Fix MD056 routing row 60 (+категория orchestration).

NB: восстановлено из backup-патча после collision. LEFTHOOK_EXCLUDE=eslint-vue — pre-existing ImportView.spec.ts:4.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:54:17 +03:00
Дмитрий ec4069ce38 docs(rules): ruflo isolation нормативка — Pravila §14.9 + Tooling §4.10 status (Rec2)
Pravila v1.28 → v1.29 (+§14.9 dormant) + Tooling v2.14 → v2.15 (§4.10 status-block).
Заказчик 18.05.2026 (Rec2 SYSTEM-аудита): изолировать ruflo от активного потока без удаления артефактов. Live-связи hooks/MCP/daemon отключены (уже в HEAD через 1412d3f), артефакты сохранены, queen-триггер §14.1 dormant.

2/3 сняты. План реактивации — memory feedback_ruflo_isolated.md.

cspell-words.txt +CCS (ADR-010 conflict code CCS1).

NB: восстановлено из backup-патча memory/rec1-5-stash-backup-2026-05-18-evening.patch после collision с параллельной сессией. LEFTHOOK_EXCLUDE=eslint-vue — pre-existing ImportView.spec.ts:4 (59dac9b).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:52:45 +03:00
Дмитрий f248e27702 feat(projects/drawer): редактирование «Источника» (site/call/sms) в карточке проекта
UX-request 18.05.2026 (п.9):
- ProjectDetailsDrawer (правая панель на /projects) теперь редактирует
  signal_identifier для site (домен) и call (телефон 7\d{10}); для sms —
  sms_senders+sms_keyword (как раньше).
- Поле «Источник» отображается **только** в карточке проекта (read-only
  в drawer сделки на /deals — Task 2 закрыл).

Backend:
- UpdateProjectRequest: condition-based валидация по signal_type из БД
  (site domain regex, call 11-digit 7\d{10}; sms — без новых правил)
- ProjectService::update: убран signal_identifier из silent-drop;
  $needsResync расширен на signal_identifier → SyncSupplierProjectJob

signal_type остаётся immutable (менять тип проекта — отдельная задача).

Larastan baseline bumped (ProjectsUpdateTest: actingAs 8→12 для 4 новых тестов).
Pest tests/Feature/Plan5/Projects/ProjectsUpdateTest 12/12.
Vitest 33 passes на Project-spec'ах. Build 2.03s.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:44:03 +03:00
Дмитрий 32006a2bda feat(projects/new-dialog): подпись «Источник» над полями на 3 табах
UX-request 18.05.2026 (п.8):
- Сайт: «Источник — домен сайта-«донора», с которого приходят лиды»
- Звонок: «Источник — телефонный номер «донора», на который звонят клиенты»
- СМС: «Источник — отправитель SMS и (опционально) ключевое слово в тексте»

Подпись text-caption text-medium-emphasis, выше существующего label поля.
Один и тот же NewProjectDialog используется и для create, и для edit.

NewProjectDialog.spec.ts 5/2sk/0 — без регрессий. Build 1.96s.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:36:09 +03:00
Дмитрий 1412d3fefd feat(deals/drawer): inline status picker — статус-chip кликабельный, без мутации props
UX-request 18.05.2026 (п.3):
- DealDetailHero: v-chip → v-menu со списком всех статусов из lead_statuses
  store; форма и цвет chip'а не меняются
- DealDetailBody: emit 'status-changed' наверх (без мутации props.deal)
- DealDetailDrawer: forward события наружу
- DealsView: onDrawerStatusChanged → optimistic update dealsState + PATCH
  /api/deals/{id} + rollback
- KanbanView: onDrawerStatusChanged → перенос карточки между колонками
  dealsByStatus + transitionDeals + rollback на ошибку

Vue правило vue/no-mutating-props соблюдено (логика в parent'е, не в Body).

Vitest 5 файлов / 38 passed на затронутых; build 2.29s.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:34:07 +03:00
Дмитрий 9fcefa3ab9 feat(map): iter8 NODE_META + ruflo isolated markers (Rec1+Rec2.5)
Rec1 — iter8 пересборка теплокарты NODE_META:
- META_SNAPSHOT 16.05 → 18.05; META_WINDOW 09-16.05 → 09-18.05 (10 дней).
- 23 новых узла волн 17-18.05 (A6/D3/C9/A4/A3/A11/C10/discovery/ADT) получили
  baseline=1, usesSrc='интеграция' (факт интеграции в коммит/plan/Tooling §4).
- mcp_figma=0, usesSrc='DEFERRED' (нет Figma-аккаунта).
- discovery_interview=3, usesSrc='скил, factual' (snapshot + это интервью + утренний).
- sk_regression=2 (verification в Sprint 1-6).
- 23 принципиально неизмеримых остались null (правила, hookify_plugin,
  ruflo_daemon/memory, фоновые economy/skill-discipline хуки, старые mem_audit_*).
- Дисклаймер-блок-комментарий обновлён (методика «factual baseline»).
- JS-smoke : 125 entries / 23 null / 31 uses=1 / 26 uses=0 / 45 uses>1.

Rec2.5 — карта ruflo isolated markers:
- 10 ruflo узлов в NODE_META помечены isolated: true
  (ruflo_queen, ruflo_plugins, ruflo_workers, ruflo_agents_catalog,
   ruflo_commands, ruflo_daemon, ruflo_memory, ruflo_mcp, ruflo_recall_hook,
   hk_ruflo_queen).
- uses=0 для всех (реальные вызовы = 0 после изоляции 18.05).
- Блок-комментарий 🔇 ИЗОЛИРОВАН с cross-ref на Pravila §14.9 / Tooling §4.10 /
  memory feedback_ruflo_isolated.md.

Snapshot — docs/discovery/2026-05-18-system-audit-brain.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:30:40 +03:00
Дмитрий e6dbbb49a1 docs(discovery): SYSTEM-аудит «мозга» 18.05.2026 — snapshot 5 осей × 125 узлов
Утренний SYSTEM-режим скила discovery-interview (Pravila §13.2 #55).
Scope: весь «мозг» (карта + тулчейн + правила).

5 осей: здоровье новых узлов / устранение конфликтов / корректность routing /
синергия 2+ узлов / пересмотр правил.

5 приоритезированных рекомендаций (Rec1–Rec5):
- Rec1 iter8 пересборка теплокарты NODE_META
- Rec2 ревизия ruflo keep/trim/off
- Rec3 off-phase routing-матрица на 30 узлов #31-60
- Rec4 панель «Связки» на карте
- Rec5 ребаланс PSR_v1 (UI-аппарат → off-phase)

cspell-words.txt: +отревизован +ребаланс +квирком +тулинг +лоадит (валидные слова).

Источник вечерней работы Rec1–Rec5 + Final CLAUDE.md sync (последующие коммиты).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:30:12 +03:00
Дмитрий 789e7dcdb6 feat(deals/drawer): убрать «Менеджер», добавить «Тип» + «Источник» read-only
UX-request 18.05.2026 (пп.4/6/7):
- удалена секция «Менеджер»/«Не назначен» (менеджеров в системе пока нет)
- добавлен параметр «Тип» (Сайт/Звонок/СМС) — project.signal_type
- добавлен параметр «Источник» (read-only):
  - site/call → project.signal_identifier (домен или телефон)
  - sms → sms_senders[0] + ' (KEYWORD)' если sms_keyword не пустой
- удалён hardcoded «Я.Директ → landing-1»

Backend: DealController index + show + update payload расширены 4 полями
project_signal_type/identifier/sms_keyword/sms_senders + eager-load
project relation расширен.

Редактирование источника — только в карточке проекта (Task 5 плана).

Larastan baseline bumped (DealShowTest: tenant 13→20, getJson 7→10 для 3 новых тестов).
Pest 51/51 на Deal-endpoints.
Vitest 108 files / 875 passed / 3 skipped (5 новых тестов DealDetailBody).
Build 2.30s.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:24:57 +03:00
Дмитрий 3bedf10449 feat(deals): drawer виден при selected≤1, bulk-полоса только при ≥2
UX-request 18.05.2026:
- selected.length === 1 → drawer авто-открывается на этой сделке,
  bulk-полоса скрыта (одну сделку проще менять через drawer)
- selected.length >= 2 → drawer закрыт, bulk-полоса видна
- selected.length === 0 → как сейчас (drawer по row-click)

Vitest 12/12 на DealsView.spec (2 новых теста + 10 существующих, none broken).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:14:03 +03:00
Дмитрий 183c719614 docs(plans): план эпика «Сделки drawer + редактирование источника проекта»
5 атомарных задач, согласованы вопросами AskUserQuestion 18.05.2026:
- Task 1: drawer visibility 0/1 vs ≥2 (пп.1+2)
- Task 2: «Менеджер» → «Тип» + «Источник» read-only в drawer (пп.4/6/7)
- Task 3: inline status picker (п.3)
- Task 4: подписи «Источник» в NewProjectDialog (п.8)
- Task 5: редактирование source в ProjectDetailsDrawer (п.9, backend+UI)

п.5 (B-префикс) уже закрыт в 36ea9cd.
cspell: +табах.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:12:07 +03:00
Дмитрий 36ea9cde04 feat(deals): убрать префикс B1_/B2_/B3_ из отображения «Источник»
Поставщик crm.bp префиксует имена проектов признаком канала-провайдера
(B1_/B2_/B3_ — три базы лидов). В UI Лидерры префикс — шум: пользователю
интересен сам проект, не канал.

Трансформация display-only — данные в БД не трогаем, фильтрация идёт по
project_id (не name).

Утилита: app/resources/js/composables/projectName.ts → stripChannelPrefix.
Регэксп ^B[123]_ case-insensitive; null/undefined/'' → ''.

Применено в 4 точках:
- DealsTable «Источник» (item.project)
- DealsFilters «Проект» dropdown (через computed-маппинг в DealsView)
- KanbanCard карточка
- DealDetailBody параметры панели

Тесты: 8 unit-тестов на утилиту (B1/B2/B3 case-insensitive, не трогать
B0/B4/Bx, не трогать префикс в середине строки, null/undefined/''),
38/38 на затронутых компонентах, 868/3sk/0 full Vitest, build 2.62s.

Smoke /deals: 20 строк, ни одна не начинается с B1_/B2_/B3_ (был
«B1_73912557675 [35]», стал «73912557675 [35]»; «B3_krk-finance.ru/...»
→ «krk-finance.ru/...»). Скриншот deals-no-bprefix-2026-05-18.png.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 14:33:33 +03:00
Дмитрий 1e4278ffb2 docs: ЭТАЛОН проекта — единый снимок текущего состояния и ключевых фактов 2026-05-18 13:00:03 +03:00
Дмитрий 515acb654c fix(adt): renumber cross-refs v1.27→v1.28 / v2.14→v2.15 after rebase
Ветка ребейзнута на parallel-sessions §15 — Pravila v1.27 и CLAUDE.md
v2.14 параллельно заняты §15-эпиком, перенумеровано Pravila→v1.28 /
CLAUDE.md→v2.15. Sync cross-refs: Tooling §0+§13 footer, PSR_v1 §0
entry, automation-graph rule-labels (pravila/claude_md узлы),
+rebase-девиация note в plan. Tooling v2.14 / PSR_v1 v3.13 — без
изменений (§15 их не трогал).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 11:46:30 +03:00
Дмитрий 7bc9ded118 docs(adt): CLAUDE.md v2.15 — register #56-#60 (rebased onto parallel-sessions §15)
Пересоздан после ребейза на parallel-sessions §15 (origin/main 781a59c).
v2.14 параллельно занят §15 — перенумеровано v2.14→v2.15: §3 title/§1 row
55→60, §3.3 +5 строк #56-#60 + footer 14 off-phase подкатегорий, §0
cross-refs Pravila v1.28 / PSR_v1 v3.13 / Tooling v2.14, §6 +абзац, §9 +запись.
Прямой Edit — worktree-constraint эксцепшн §5 п.10.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 11:42:53 +03:00
Дмитрий 30d1a3c756 docs(adt): Pravila v1.28 — §13.2 +Off-phase authoring-tooling + dev-support
Пересоздан после ребейза feat/anthropic-dev-tooling на parallel-sessions
§15 (origin/main 781a59c). v1.27 параллельно занят §15 — перенумеровано
v1.27→v1.28: §13.2 +абзац (тринадцатая off-phase подкатегория
authoring-tooling #56-#58 + четырнадцатая dev-support #59-#60),
+«Что изменилось в v1.28» блок, +§13 history-row.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 11:39:01 +03:00
Дмитрий 7e167cf943 fix(map): adt — dedup psr_v1 edges (remove 4 stale iter7 duplicates superseded by ADT-block) 2026-05-18 11:35:47 +03:00
Дмитрий cb5bb7dbaf feat(map): adt — register #56-#60 in nd(), 5 edges to psr_v1, hookify conflict 🔴🟢, rule labels v2.14 2026-05-18 11:35:47 +03:00
Дмитрий 942f5364e8 docs(adt): PSR_v1 v3.13 — R10.1 Блок 1 +5 строк (skill-creator/plugin-dev/hookify/claude-code-setup/context7) + hookify HK1 pre-check 2026-05-18 11:35:34 +03:00
Дмитрий fcba06172a docs(adt): Tooling Прил. Н v2.14 — register #56-#60 (authoring-tooling + dev-support) 2026-05-18 11:35:34 +03:00