Commit Graph

2630 Commits

Author SHA1 Message Date
Дмитрий 41a3ce5e80 docs(plan): Plan 2 (входящее распределение) — переделка миграции проектов
5 TDD-задач: RegionTagResolver (тег субъекта -> код, зеркало regions.ts),
LeadRouter на pivot без phone-фильтра, LeadDistributor cap=3 (seedable RNG),
RouteSupplierLeadJob (cap + deal.subject_code из тега), регрессия.
Второй из 4 планов эпика. +cspell. Реализация не начата.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 10:09:22 +03:00
Дмитрий 884f761183 docs(plan): Plan 1 (фундамент данных) — переделка миграции проектов
7 TDD-задач: supplier_projects.subject_code + per-subject unique (NULLS NOT
DISTINCT), pivot project_supplier_links (замена 3 FK-слотов), deals.subject_code,
seed supplier_export_mode, belongsToMany связи, backfill pivot, регрессия.
Первый из 4 планов эпика (см. spec §3). +cspell сид/бэкофилл. Реализация не начата.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 10:09:20 +03:00
Дмитрий ebbeab3a5e docs(spec): design — переделка миграции проектов + распределения лидов
Закрыты 5 под-вопросов brainstorming + P1 (Вся РФ = 1 пул + предупреждение
с подтверждением) + P2 (один связный spec). Ядро: 3-FK слоты -> M:N pivot,
per-субъект supplier_projects (subject_code), формула заказа max(наиб, ceil(Σ/3)),
cap=3 рандом из недобравших, ручной экран очистки в админке, режимы экспорта
online/batch (глобальный тумблер). R2 уже 18:00. R-SAVE = вариант а (дочитать
listProjects). Реализация не начата.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 10:08:31 +03:00
Дмитрий fad041f414 feat(map): finance-tooling — populate C6+C7 (+3 nodes, +7 edges)
+finance_plugin (C7+C6) / billing_audit (C6) / ru_tax (C7) + reuse secondary-
классификация (Boost/Pest/Larastan/Sentry/Redis/PM/data-scientist/operations/
process-*/context7) + NODE_DETAILS + NODE_META + версии-метки (pravila v1.34 /
claude_md v2.21 / psr_v1 v3.18 / tooling v2.18). JS-smoke: 137 nodes / 155 edges,
0 drift. ADR-012.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 09:54:25 +03:00
Дмитрий 2c673dd980 docs(router): finance-tooling routing rows + L13 chain (routing-off-phase v1.2)
+3 строки routing (#61 finance plugin / #62 billing-audit / #63 ru-tax-accounting),
связка L13 (финансовая цепочка C6->C7), scope §4.11->§4.38. router-procedure v1.1
changelog. ADR-012.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 09:51:28 +03:00
Дмитрий 7565e8e05b docs(normative): finance-tooling #61-#63 cross-ref version bump
Tooling Прил.Н v2.18 (§4.36/37/38 + §0 60->63 + 15-я подкатегория) +
PSR_v1 v3.18 (R10.1 Блок 1 +finance + note) + Pravila v1.34 (§13.2 +абзац) +
CLAUDE.md v2.21 (§3.3 +#61-63 + §0 cross-refs + §6 + §9).
Атомарный version-bump-набор (cross-ref-checker C2 STRICT: 0 drift). ADR-012.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 09:49:52 +03:00
Дмитрий e8a01f3d23 docs(adr): ADR-012 finance-tooling boundary C6/C7
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 09:40:33 +03:00
Дмитрий 28ddd98893 feat(finance): ru-tax-accounting skill — РСБУ/НК РФ context C7
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 09:37:52 +03:00
Дмитрий 2a73ee0cfe feat(finance): billing-audit skill — money invariants C6
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 09:31:30 +03:00
Дмитрий fee8efc809 docs(finance): C6+C7 finance-tooling implementation plan
11 задач в 3 фазах: Ф1 billing-audit скил (C6), Ф2 finance plugin enable +
ru-tax-accounting скил (C7), Ф3 нормативка (Tooling/PSR/Pravila/CLAUDE) +
роутер (routing-off-phase L13 + router-procedure) + наблюдатель (9-атрибутные
блоки + C1/C2) + карта (+3 узла) + ADR-012 + push.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 09:19:50 +03:00
Дмитрий 2ef20d7d48 docs(finance): C6+C7 finance-tooling epic design spec
Объединённый эпик «Финансы»: наполнение разделов карты C6 (биллинг/тарификация)
+ C7 (бухгалтерия/налоги). 3 новых узла (#61 finance plugin, #62 billing-audit,
#63 ru-tax-accounting) + reuse-классификация + расширенная нормативка
(роутер routing-off-phase.md + наблюдатель 9-атрибутные блоки) + ADR-012.
+9 терминов в cspell-words.txt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 09:11:07 +03:00
Дмитрий 84a56d449e docs(discovery): brief переделки миграции проектов + распределения лидов
Зафиксированы решения discovery-интервью 2026-05-20: два режима экспорта
проектов (онлайн + пакетный 18:00 МСК), один save с тремя флагами B1+B2+B3,
tag=регион, и новый алгоритм распределения лидов (cap=3 рандом из недобравших,
заказ = max(наиб_лимит, ceil(Σ/3)); группировка отменена). Реализация не начата.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 08:58:57 +03:00
Дмитрий 91030445fe feat(map): iter9 — brain governance subsystem (+9 nodes, +12 edges, +1 GREEN)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 05:12:24 +03:00
Дмитрий 02dc9a88c5 docs(map): iter9 implementation plan
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 04:59:29 +03:00
Дмитрий 0678d702e6 docs(map): spec self-review fix — edges 13->12
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 04:50:18 +03:00
Дмитрий 031f745c13 docs(map): iter9 brain-governance design spec
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 04:49:32 +03:00
Дмитрий c44299eac9 docs(etalon): refresh snapshot after supplier-migration-followup epic (HEAD 667f8fa→d24482c, demo re-seed, failover live-smoke) 2026-05-20 04:10:09 +03:00
Дмитрий d24482c123 docs(observer): sync spec §6 with as-built factor-analyzer
§6 drifted from the implemented brain-retro analyzer after Phase 1.2/1.3:
- factor matrix now lists 9 axes (session_turn + parallel_session were
  captured in the episode schema §3 but missing from the §6 matrix);
- outcome inference documents 'blocked' (error events > retry events) and
  notes 'failure' as deferred to the phase-2 agent-judge.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 18:17:17 +03:00
Дмитрий a2e63d2076 fix(observer): brain-retro analyzer — blocked outcome + v1 filter + factors
P0.1b: inferOutcome emits 'blocked' when a turn had more error than retry
events (an unrecovered tool failure) — previously the enum value was dead.

P0.1c: 'failure' documented as deferred to the phase-2 agent-judge. It is a
judgment (work wrong AND never corrected), not deterministically recoverable
from a transcript; a wrong-then-corrected turn surfaces as 'rework'.

P1.1: analyze() drops v1 episodes (no schema_version 2) — they lack
environment/prompt_signal/decision_provenance and polluted the factor
matrix. Reports v1SkippedCount.

P2.1: session_turn (bucketed early/mid/late) and parallel_session added to
FACTOR_FNS — closes the schema↔matrix mismatch (both were captured in the
episode but absent from the factor axes).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 17:40:44 +03:00
Дмитрий 30d7afc54e fix(observer): transcript-parser accuracy — session_turn + correction signal
P0.2: count session_turn from the last compaction. The transcript file
accumulates duplicated context-rebuild snapshots (quirk #101), so counting
real prompts from i=0 inflated it and made it non-monotonic. Now counts
"real prompts since the last compaction" — monotonic by construction.

P0.1a: widen the correction prompt_signal regex (не работает / сломал /
опять / откати / revert / still not / wrong / ...). The old regex was too
narrow, so rework outcomes were invisible to the factor analysis.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 17:40:29 +03:00
Дмитрий 667f8fa114 docs(discovery): 3-tier failover live-smoke 2026-05-19 — all tiers green, 156/156 Supplier suite 2026-05-19 17:31:15 +03:00
Дмитрий 2012026637 fix(supplier): manage-project.js — drop wrong status-switch click + recon live-smoke
Task 4 live-smoke выявил: единственный .el-switch формы — include/exclude
регионов (regions_reverse), НЕ статус active/paused. Старый код кликал его
по dto.active → ошибочно ставил regions_reverse. Статус — дефолт портала
(active), UI-switch для него нет → switch-блок удалён.

recon-doc 2026-05-19-rt-project-form-locators.md: +секция Live-smoke
(domain-формат валидируется, multi-source save = N проектов, switch = regions,
type/tab re-render); row 6 исправлен.
2026-05-19 17:31:15 +03:00
Дмитрий 702bf22ac1 fix(supplier): manage-project.js robustness — conditional type/tab clicks + diag dump
Найдено при Task 4 live-smoke form-канала:
- type-select и вкладка «Список» кликались безусловно → re-click уже-активного
  значения ремоунтит Element UI tab-pane (textarea детачится). Теперь кликаем
  только при реальной смене значения + waitForTimeout после смены типа.
- defensive: проверка непустого textarea после fill content.
- diag: на status!=OK дамп фактически отправленного rt-project-save body в stderr.
2026-05-19 17:31:14 +03:00
Дмитрий c1af7ddcc2 fix(supplier): manage-project.js — text-only platform locator + exact endsWith URL match (reviewer Critical+Important) 2026-05-19 17:31:13 +03:00
Дмитрий 4c1f32419f feat(supplier): rewrite manage-project.js for Element UI + intercept rt-project-save response for external_id
- fillForm rewritten to label-for locators (.el-form-item:has([for="..."])) from recon 2026-05-19
- createOp: external_id from page.waitForResponse('rt-project-save') body, not DOM
- updateOp: same save endpoint intercept; row found by data-id or text
- listOp: Vuex state strategy 1, DOM scrape strategy 2, empty array fallback
- Known gaps (JSDoc + stderr warnings): workdays not in add-project form (portal default);
  regions require id->name mapping (skipped in Tier-2 MVP, logged to stderr)
- Test: HTTP fixture server serves rt-form-element-ui.html + handles /admin/visit/rt-project-save
- Fixture: .v-dialog--active wrapper + 10 .el-form-item (label[for=...]) + type-select popup in body

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19 17:31:13 +03:00
Дмитрий b9fff59f9c docs(discovery): rt-project form locators recon (Element UI + Vuetify dialog, 10 fields) 2026-05-19 17:31:12 +03:00
Дмитрий 0c3ff35485 test(supplier): cover FailoverProjectChannel tier-3 escalation + transient bypass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19 17:31:11 +03:00
Дмитрий 4d331457ea test(supplier): lock HTTP-200-without-Content-Type contract (no login-detect false-positive) 2026-05-19 17:31:11 +03:00
Дмитрий 39288a7152 feat(supplier): detect HTTP-200 HTML login page → force refresh+retry (defense-in-depth) 2026-05-19 17:30:54 +03:00
Дмитрий 49fc6ea580 docs(supplier): plan for migration follow-up — HTTP-200 login detect + form rewrite + 3-tier smoke 2026-05-19 17:29:52 +03:00
Дмитрий ac7017f405 fix(brain): redirect / to /docs/observer/dashboard.html (browser-smoke fix)
Browser smoke (Playwright) revealed that rewriting path internally without
changing the response URL left the browser's base URL as /, breaking
relative <script src="dashboard.js"> and ../automation-graph-data.js
references. 302 redirect makes the browser settle on /docs/observer/,
which resolves the relative paths correctly. All 4 views verified clean
(0 console errors). Screenshots: brain-dashboard-{map,replay,feed,aggregate}-view.png.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 16:23:52 +03:00
Дмитрий f1ec324eed feat(brain): Forest polish + observer README entry for the dashboard 2026-05-19 16:23:52 +03:00
Дмитрий 8f3c24af76 feat(brain): conflict three-layer panel (design / friction / correlation) +3 tests 2026-05-19 16:23:51 +03:00
Дмитрий 97c93140a6 feat(brain): Агрегат view — metric tiles + node heat overlay 2026-05-19 16:23:51 +03:00
Дмитрий 139527261c feat(brain): aggregator — node heat, distributions, redirect rate (+4 tests) 2026-05-19 16:23:50 +03:00
Дмитрий 19cf599c67 feat(brain): Лента auto-poll with pause (5s interval, view-driven) 2026-05-19 16:23:50 +03:00
Дмитрий 7a5e2d1962 feat(brain): Лента view — groupBySession + grouped feed UI 2026-05-19 16:23:49 +03:00
Дмитрий 83648bdc45 feat(brain): Разбор view UI — list + filters + trajectory highlight 2026-05-19 16:23:49 +03:00
Дмитрий 5b08c94e3f feat(brain): filterEpisodes + 3 tests (Task 7 logic; UI deferred)
Worktree has no app/node_modules — vitest not run here; final regression
deferred to main-checkout post parallel-session release. Logic is a 7-line
pure filter; tests cover empty filter, classification, errors-only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 16:23:48 +03:00
Дмитрий 71ed478536 feat(brain): Карта view — plain topology + design conflicts list 2026-05-19 16:23:48 +03:00
Дмитрий e51aa39fbb feat(brain): dashboard shell + graph banner + view switching 2026-05-19 16:23:47 +03:00
Дмитрий 56fbc0a6cd feat(brain): node attribution — episode signals to graph nodes 2026-05-19 16:23:46 +03:00
Дмитрий a44db17366 feat(brain): episode JSONL parser + v1/v2 normalizer 2026-05-19 16:23:46 +03:00
Дмитрий 170fc69a64 refactor(brain): extract automation-graph topology to a shared data file 2026-05-19 16:23:45 +03:00
Дмитрий a10014f45d feat(brain): static server + /api/episodes for the dashboard 2026-05-19 16:23:45 +03:00
Дмитрий df5e0ad0c9 fix(brain): correct vitest command in plan — run from app/
The config's include `../tools/*.test.mjs` resolves relative to its
own dir (app/), not cwd. Baseline verified 2026-05-19 from app/:
11 files, 169 tests passing, 0 failures.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 16:23:44 +03:00
Дмитрий cb3b7be366 docs(brain): brain dashboard implementation plan
13 tasks across 3 phases — static server + topology extraction + 4 views
(Карта / Разбор / Лента / Агрегат). TDD on dashboard-core.js, smoke on UI.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 16:23:44 +03:00
Дмитрий 47a257624a docs(brain): brain dashboard design spec
Standalone HTML dashboard that visualises the observer episode log over
the automation-graph topology — 4 views (map / task-replay / session
feed / aggregate), graph as shared canvas, 3-phase build order.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 16:23:43 +03:00
Дмитрий fc98999bfe fix(supplier): refresh-session.js — устранена гонка Promise.all/click
Логин-страница уже в состоянии networkidle → waitForLoadState резолвился
мгновенно (до пост-логин редиректа), скрипт хватал PHPSESSID
неаутентифицированной логин-страницы. CSV-сверка 11:00 (19.05) упала
"load-reports returned non-array response" — портал отдал HTTP 200
+ HTML логин-страницы вместо JSON-массива отчётов.

После клика submit:
- waitForFunction опрашивает исчезновение #loginform-username из DOM
  (переживает навигацию);
- guard exit 1, если форма осталась — отклонённый логин больше не
  маскируется под «успех» (exit 0).

Verified: 2× RefreshSupplierSessionJob → валидная сессия (load-reports
JSON-массив из 39 отчётов); CsvReconcileJob id=7 status=ok.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 15:26:39 +03:00
Дмитрий 1209aef4b5 chore: .gitattributes — force LF for *.mjs (prevent CRLF/vitest breakage)
core.autocrlf=true rewrites .mjs to CRLF in the working tree on
checkout/rebase. vitest fails to load CRLF .mjs files with imports
(SyntaxError: Invalid or unexpected token, no location) — node --check
and esbuild tolerate it, only vitest's transform breaks. `*.mjs text
eol=lf` pins LF in the working tree regardless of autocrlf.

See memory quirk #100. Repo blobs were already LF — no content change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 14:05:36 +03:00