From 4a25302ac9abcf4448f158e86e20ae5ccade0ae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 18 Jun 2026 23:39:50 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=80=D0=B0=D0=B7=D0=B2=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=D1=87=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BA=D0=B0=20finance-plugin=20=E2=80=94=208=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B2=D1=8B=D0=BA=D0=BE=D0=B2=20(=D1=80=D0=BE=D1=83?= =?UTF-8?q?=D1=82=D0=B5=D1=80-=D1=80=D0=B5=D0=B5=D1=81=D1=82=D1=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик finance-plugin развёрнут в 8 карточек-навыков + 8 под-узлов #61a..#61h. - 8 карточек: audit-support, close-management, financial-statements, journal-entry, journal-entry-prep, reconciliation, sox-testing, variance-analysis - journal-entry (финализация) и journal-entry-prep (подготовка к close) оставлены обе с разными визитками (решение по дублю) - nodes.yaml: узел #61 → #61a..#61h; триггеры распределены; ADR-012 граница на sox-testing (SOX n/a РФ) - зонтик убран; registry-load.test: 145 узлов / 137 active Регрессия (без 5 pre-existing node:test файлов): 4365 passed, exit 0. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../contracts/finance-plugin.contract.json | 12 -- ...inance-plugin__audit-support.contract.json | 29 ++++ ...nce-plugin__close-management.contract.json | 29 ++++ ...plugin__financial-statements.contract.json | 29 ++++ ...e-plugin__journal-entry-prep.contract.json | 29 ++++ ...inance-plugin__journal-entry.contract.json | 29 ++++ ...nance-plugin__reconciliation.contract.json | 29 ++++ .../finance-plugin__sox-testing.contract.json | 29 ++++ ...ce-plugin__variance-analysis.contract.json | 29 ++++ docs/registry/nodes.yaml | 124 ++++++++++++++++-- docs/registry/splitting-inventory.md | 4 +- tools/registry-load.test.mjs | 10 +- 12 files changed, 350 insertions(+), 32 deletions(-) delete mode 100644 docs/registry/contracts/finance-plugin.contract.json create mode 100644 docs/registry/contracts/finance-plugin__audit-support.contract.json create mode 100644 docs/registry/contracts/finance-plugin__close-management.contract.json create mode 100644 docs/registry/contracts/finance-plugin__financial-statements.contract.json create mode 100644 docs/registry/contracts/finance-plugin__journal-entry-prep.contract.json create mode 100644 docs/registry/contracts/finance-plugin__journal-entry.contract.json create mode 100644 docs/registry/contracts/finance-plugin__reconciliation.contract.json create mode 100644 docs/registry/contracts/finance-plugin__sox-testing.contract.json create mode 100644 docs/registry/contracts/finance-plugin__variance-analysis.contract.json diff --git a/docs/registry/contracts/finance-plugin.contract.json b/docs/registry/contracts/finance-plugin.contract.json deleted file mode 100644 index a13af1f..0000000 --- a/docs/registry/contracts/finance-plugin.contract.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "skill": "finance-plugin", - "kind": "external", - "needs": ["финансовая задача (сверка/variance/проводки/отчётность)"], - "produces": ["сверка / variance-анализ / проводки / финотчётность"], - "constraints": ["US-GAAP-ориентирован, частично применим РФ; SOX not-applicable", "РФ-налоги — за ru-tax-accounting (#63); ADR-012 граница C6/C7", "warehouse-MCP DEFERRED"], - "preview-form": "outline", - "defaults": ["reconciliation/variance применимы; US-GAAP-скилы с осторожностью"], - "key-decisions": ["применим ли скил для РФ-контекста"], - "acceptance-criteria": ["финансовая операция корректна, РФ-ограничения учтены"], - "source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" } -} diff --git a/docs/registry/contracts/finance-plugin__audit-support.contract.json b/docs/registry/contracts/finance-plugin__audit-support.contract.json new file mode 100644 index 0000000..ac93aac --- /dev/null +++ b/docs/registry/contracts/finance-plugin__audit-support.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "finance-plugin:audit-support", + "kind": "external", + "needs": [ + "SOX-404 контроль для тестирования" + ], + "produces": [ + "workpapers, sample selection, классификация deficiency" + ], + "constraints": [ + "под-навык зонтика finance (US-GAAP финансы)", + "граница C6/C7 ADR-012; SOX not-applicable РФ; РФ-учёт — ru-tax-accounting" + ], + "preview-form": "outline", + "defaults": [ + "audit-support — поддержка SOX-404 тестирования" + ], + "key-decisions": [ + "какой контроль и sample" + ], + "acceptance-criteria": [ + "тестирование контроля задокументировано" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/finance-plugin__close-management.contract.json b/docs/registry/contracts/finance-plugin__close-management.contract.json new file mode 100644 index 0000000..eaf537f --- /dev/null +++ b/docs/registry/contracts/finance-plugin__close-management.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "finance-plugin:close-management", + "kind": "external", + "needs": [ + "процесс month-end close для управления" + ], + "produces": [ + "close-календарь: sequencing, dependencies, статус" + ], + "constraints": [ + "под-навык зонтика finance (US-GAAP финансы)", + "граница C6/C7 ADR-012; SOX not-applicable РФ; РФ-учёт — ru-tax-accounting" + ], + "preview-form": "outline", + "defaults": [ + "close-management — управление закрытием периода" + ], + "key-decisions": [ + "порядок и блокеры close" + ], + "acceptance-criteria": [ + "close спланирован по дням" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/finance-plugin__financial-statements.contract.json b/docs/registry/contracts/finance-plugin__financial-statements.contract.json new file mode 100644 index 0000000..89539fe --- /dev/null +++ b/docs/registry/contracts/finance-plugin__financial-statements.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "finance-plugin:financial-statements", + "kind": "external", + "needs": [ + "данные для финансовой отчётности" + ], + "produces": [ + "P&L, balance sheet, cash flow + variance vs budget" + ], + "constraints": [ + "под-навык зонтика finance (US-GAAP финансы)", + "граница C6/C7 ADR-012; SOX not-applicable РФ; РФ-учёт — ru-tax-accounting" + ], + "preview-form": "outline", + "defaults": [ + "financial-statements — генерация финстейтментов (GAAP)" + ], + "key-decisions": [ + "какие материальные variance" + ], + "acceptance-criteria": [ + "отчётность по GAAP-презентации" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/finance-plugin__journal-entry-prep.contract.json b/docs/registry/contracts/finance-plugin__journal-entry-prep.contract.json new file mode 100644 index 0000000..c5f2f56 --- /dev/null +++ b/docs/registry/contracts/finance-plugin__journal-entry-prep.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "finance-plugin:journal-entry-prep", + "kind": "external", + "needs": [ + "накопления/prepaid/амортизация для month-end" + ], + "produces": [ + "подготовленные проводки close (accruals/prepaid/depreciation/payroll)" + ], + "constraints": [ + "под-навык зонтика finance (US-GAAP финансы)", + "граница C6/C7 ADR-012; SOX not-applicable РФ; РФ-учёт — ru-tax-accounting" + ], + "preview-form": "outline", + "defaults": [ + "journal-entry-prep — подготовка проводок к закрытию" + ], + "key-decisions": [ + "какие accrual-проводки" + ], + "acceptance-criteria": [ + "проводки close подготовлены" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/finance-plugin__journal-entry.contract.json b/docs/registry/contracts/finance-plugin__journal-entry.contract.json new file mode 100644 index 0000000..8e8ea04 --- /dev/null +++ b/docs/registry/contracts/finance-plugin__journal-entry.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "finance-plugin:journal-entry", + "kind": "external", + "needs": [ + "операция для проводки (debits/credits)" + ], + "produces": [ + "journal entry с обоснованием для аудита" + ], + "constraints": [ + "под-навык зонтика finance (US-GAAP финансы)", + "граница C6/C7 ADR-012; SOX not-applicable РФ; РФ-учёт — ru-tax-accounting" + ], + "preview-form": "outline", + "defaults": [ + "journal-entry — финализация проводки" + ], + "key-decisions": [ + "дебет/кредит и обоснование" + ], + "acceptance-criteria": [ + "проводка сбалансирована и обоснована" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/finance-plugin__reconciliation.contract.json b/docs/registry/contracts/finance-plugin__reconciliation.contract.json new file mode 100644 index 0000000..5cc463c --- /dev/null +++ b/docs/registry/contracts/finance-plugin__reconciliation.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "finance-plugin:reconciliation", + "kind": "external", + "needs": [ + "GL-баланс vs subledger/bank для сверки" + ], + "produces": [ + "рекконсиляция + категоризация reconciling items" + ], + "constraints": [ + "под-навык зонтика finance (US-GAAP финансы)", + "граница C6/C7 ADR-012; SOX not-applicable РФ; РФ-учёт — ru-tax-accounting" + ], + "preview-form": "outline", + "defaults": [ + "reconciliation — сверка счетов" + ], + "key-decisions": [ + "источник расхождений" + ], + "acceptance-criteria": [ + "счета сверены, расхождения объяснены" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/finance-plugin__sox-testing.contract.json b/docs/registry/contracts/finance-plugin__sox-testing.contract.json new file mode 100644 index 0000000..d75020e --- /dev/null +++ b/docs/registry/contracts/finance-plugin__sox-testing.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "finance-plugin:sox-testing", + "kind": "external", + "needs": [ + "контроль для SOX-404 тестирования (US)" + ], + "produces": [ + "sample, workpaper, оценка deficiency" + ], + "constraints": [ + "под-навык зонтика finance (US-GAAP финансы)", + "граница C6/C7 ADR-012; SOX not-applicable РФ; РФ-учёт — ru-tax-accounting" + ], + "preview-form": "outline", + "defaults": [ + "sox-testing — SOX-404 тестирование (US-only, n/a РФ)" + ], + "key-decisions": [ + "scope контроля" + ], + "acceptance-criteria": [ + "контроль протестирован" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/finance-plugin__variance-analysis.contract.json b/docs/registry/contracts/finance-plugin__variance-analysis.contract.json new file mode 100644 index 0000000..1ed09db --- /dev/null +++ b/docs/registry/contracts/finance-plugin__variance-analysis.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "finance-plugin:variance-analysis", + "kind": "external", + "needs": [ + "финансовые variance для разбора" + ], + "produces": [ + "декомпозиция драйверов + waterfall + narrative" + ], + "constraints": [ + "под-навык зонтика finance (US-GAAP финансы)", + "граница C6/C7 ADR-012; SOX not-applicable РФ; РФ-учёт — ru-tax-accounting" + ], + "preview-form": "outline", + "defaults": [ + "variance-analysis — разбор бюджет-vs-факт" + ], + "key-decisions": [ + "драйверы variance" + ], + "acceptance-criteria": [ + "variance объяснён по драйверам" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/nodes.yaml b/docs/registry/nodes.yaml index a12478a..5dd2010 100644 --- a/docs/registry/nodes.yaml +++ b/docs/registry/nodes.yaml @@ -1712,27 +1712,125 @@ nodes: attributes: tooling_section: "§4.35 #60" - - id: "#61" - name: "finance plugin" - slug: "finance-plugin" + - id: "#61a" + name: "finance-audit-support" + slug: "finance-plugin:audit-support" category: "off-phase" subcategory: "finance-tooling" status: "active" dormancy_reason: null - capabilities: "Плагин для финансовых операций: сверка (reconciliation), variance-анализ, подготовка проводок, финансовая отчётность; US-GAAP-ориентирован, частично применим для РФ; SOX not-applicable." + capabilities: "Поддержка SOX-404: workpapers, sample selection, классификация deficiency." + triggers: + - {keyword: "audit support", weight: 1.0} + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.36 #61" + + - id: "#61b" + name: "finance-close-management" + slug: "finance-plugin:close-management" + category: "off-phase" + subcategory: "finance-tooling" + status: "active" + dormancy_reason: null + capabilities: "Управление month-end close: sequencing, dependencies, статус по дням." + triggers: + - {keyword: "close", weight: 1.0} + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.36 #61" + + - id: "#61c" + name: "finance-financial-statements" + slug: "finance-plugin:financial-statements" + category: "off-phase" + subcategory: "finance-tooling" + status: "active" + dormancy_reason: null + capabilities: "Финстейтменты (P&L, balance sheet, cash flow) + variance vs budget по GAAP." + triggers: + - {keyword: "us-gaap-отчётность", weight: 1.0} + - {keyword: "financial statements", weight: 1.0} + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.36 #61" + + - id: "#61d" + name: "finance-journal-entry" + slug: "finance-plugin:journal-entry" + category: "off-phase" + subcategory: "finance-tooling" + status: "active" + dormancy_reason: null + capabilities: "Финализация проводки (debits/credits) с обоснованием для аудита." + triggers: + - {keyword: "проводки", weight: 1.0} + - {keyword: "journal entry", weight: 1.0} + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.36 #61" + + - id: "#61e" + name: "finance-journal-entry-prep" + slug: "finance-plugin:journal-entry-prep" + category: "off-phase" + subcategory: "finance-tooling" + status: "active" + dormancy_reason: null + capabilities: "Подготовка проводок к закрытию: accruals, prepaid, depreciation, payroll. (Подготовка ≠ финализация journal-entry.)" + triggers: [] + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.36 #61" + + - id: "#61f" + name: "finance-reconciliation" + slug: "finance-plugin:reconciliation" + category: "off-phase" + subcategory: "finance-tooling" + status: "active" + dormancy_reason: null + capabilities: "Сверка GL vs subledger/bank + категоризация reconciling items." triggers: - {keyword: "сверка", weight: 1.0} - - {keyword: "variance-анализ", weight: 1.0} - - {keyword: "us-gaap-отчётность", weight: 1.0} - - {keyword: "проводки", weight: 1.0} - - {keyword: "close", weight: 1.0} - {keyword: "reconciliation", weight: 1.0} - - {keyword: "variance", weight: 1.0} - - {keyword: "journal entry", weight: 1.0} - - {keyword: "financial statements", weight: 1.0} - - {keyword: "audit support", weight: 1.0} + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.36 #61" + + - id: "#61g" + name: "finance-sox-testing" + slug: "finance-plugin:sox-testing" + category: "off-phase" + subcategory: "finance-tooling" + status: "active" + dormancy_reason: null + capabilities: "SOX-404 тестирование контролей (US-only; not-applicable РФ по ADR-012)." + triggers: [] boundaries: - - {adr: "ADR-012", role: "граница C6/C7; US-GAAP-скилы частично применимы; SOX not-applicable РФ; warehouse-MCP DEFERRED"} + - {adr: "ADR-012", role: "SOX not-applicable РФ; US-GAAP частично применим"} + chain_membership: [] + attributes: + tooling_section: "§4.36 #61" + + - id: "#61h" + name: "finance-variance-analysis" + slug: "finance-plugin:variance-analysis" + category: "off-phase" + subcategory: "finance-tooling" + status: "active" + dormancy_reason: null + capabilities: "Декомпозиция variance на драйверы + waterfall + narrative (бюджет vs факт)." + triggers: + - {keyword: "variance-анализ", weight: 1.0} + - {keyword: "variance", weight: 1.0} + boundaries: [] chain_membership: [] attributes: tooling_section: "§4.36 #61" diff --git a/docs/registry/splitting-inventory.md b/docs/registry/splitting-inventory.md index 502b272..304a6e8 100644 --- a/docs/registry/splitting-inventory.md +++ b/docs/registry/splitting-inventory.md @@ -118,8 +118,8 @@ | product-management (8) | ✅ DONE | 0258b9d (pushed) | | design-plugin (7) | ✅ DONE | bf3d557 (committed, push deferred — observer-race) | | marketing-plugin (8) | ✅ DONE | committed (push deferred) | -| operations (9: +process-doc узел) | ✅ DONE | этот коммит (push deferred) | -| finance-plugin (7–8) | ⬜ | | +| operations (9: +process-doc узел) | ✅ DONE | committed (push deferred) | +| finance-plugin (8, journal ×2 оставлены) | ✅ DONE | этот коммит (push deferred) | | brand-voice (3) | ⬜ | | | ui-ux-pro-max (7, +правка PSR) | ⬜ | | diff --git a/tools/registry-load.test.mjs b/tools/registry-load.test.mjs index 7ef68f9..e4529fb 100644 --- a/tools/registry-load.test.mjs +++ b/tools/registry-load.test.mjs @@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi describe('registry-load', () => { beforeEach(() => clearCache()); - it('loads registry (138 nodes: разворачивание #33/#19/#57/#36/#42/#46/#74/#51 комков 18.06.2026)', () => { + it('loads registry (145 nodes: разворачивание #33/#19/#57/#36/#42/#46/#74/#51/#61 комков 18.06.2026)', () => { const r = loadRegistry(); - expect(r.nodes).toHaveLength(138); + expect(r.nodes).toHaveLength(145); expect(r.version).toBe('0.1.0'); }); @@ -46,9 +46,9 @@ describe('registry-load', () => { it('findActiveNodes excludes non-active (nodes.yaml registry)', () => { const r = loadRegistry(); const active = findActiveNodes(r); - // 138 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred; - // развёрнуты: #33→2,#19→14,#57→7,#36→2,#42→8,#46→7,#74→8,#51 operations→9 (+8) → 130 active - expect(active).toHaveLength(130); + // 145 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred; + // развёрнуты: ...,#51→9,#61 finance→8 (+7) → 137 active + expect(active).toHaveLength(137); expect(active.map(n => n.id)).toContain('#18'); expect(active.map(n => n.id)).toContain('#19a'); expect(active.map(n => n.id)).not.toContain('#1');