From 88987abaa6b20b01f6230a1fc1e84cb9ad4b3a93 Mon Sep 17 00:00:00 2001 From: zosimovaa Date: Tue, 14 Apr 2026 16:40:30 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B0?= =?UTF-8?q?=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04. Analitycs artefacts - documentation.md | 289 ++ .../04. Analitycs artefacts - features.md | 185 ++ _process/04. Analitycs artefacts.md | 852 ------ _process/05. MVP - process_v2.1.md | 33 + _process/doc_rules_v3/README.md | 37 + .../common-elements/api-contract.md | 21 + .../common-elements/db-columns.md | 17 + .../common-elements/db-constraints.md | 16 + .../common-elements/db-purpose.md | 12 + .../doc_rules_v3/common-elements/db-usage.md | 11 + .../doc_rules_v3/common-elements/details.md | 10 + _process/doc_rules_v3/common-elements/fr.md | 31 + _process/doc_rules_v3/common-elements/nfr.md | 20 + .../common-elements/sql-example.md | 15 + .../doc_rules_v3/common-elements/summary.md | 10 + .../common-elements/tech-use-case.md | 16 + .../common-elements/ui-requirements.md | 22 + .../common-elements/user-analytics.md | 7 + _process/doc_rules_v3/documentation-rules.md | 45 + .../doc_rules_v3/global/analytics-to-doc.md | 10 + _process/doc_rules_v3/global/filepaths.md | 67 + _process/doc_rules_v3/global/frontmatter.md | 32 + _process/doc_rules_v3/global/header-rules.md | 10 + .../global/layer-responsibility.md | 10 + .../templates/api_method.template.md | 34 + .../templates/db_table.template.md | 38 + .../templates/logic_block.template.md | 28 + .../templates/ui_page.template.md | 33 + .../20260408-095601-28fa24cfdd8f.md | 1011 ------- .../20260408-130754-c008300db553.md | 103 - .../20260408-130830-d398ef674b67.md | 103 - .../20260408-131217-d6aef7712b50.md | 303 -- .../20260408-133710-3fcdfdcab8be.md | 303 -- .../20260408-134243-ae814cadec74.md | 305 -- .../20260408-135621-3d42c447c174.md | 306 -- .../20260408-135847-14bbe60d0cc3.md | 306 -- .../20260408-144949-393097ecb1c4.md | 346 --- .../20260408-161523-4e5327abba47.md | 1244 -------- .../20260408-162001-36267a366e93.md | 1274 -------- .../20260409-072516-8165fa8703a6.md | 1931 ------------ .../20260409-072648-48cbd7c792dd.md | 1954 ------------ .../20260409-143441-a16face9a0ab.md | 347 --- .../20260409-143722-a9b20eb67e95.md | 323 -- .../20260409-145546-36056dd8dcfe.md | 323 -- .../20260409-151154-b91584f20703.md | 323 -- .../20260409-151329-2d1087092e43.md | 323 -- .../20260409-151338-51ca80f9145e.md | 323 -- .../20260409-151841-faa90484f29c.md | 1705 ----------- .../20260409-152858-906a9a1ffd45.md | 1434 --------- .../20260409-153809-3f140269bb3f.md | 1434 --------- .../20260409-160321-c0c145c3b5d3.md | 1843 ------------ .../20260409-160845-116dcbbcf50b.md | 1478 --------- .../20260409-173834-30e34019284e.md | 511 ---- .../20260410-072618-f641b32d79e2.md | 1538 ---------- .../20260410-085902-560bc90e200f.md | 1538 ---------- .../20260410-090548-70665e6dd3a5.md | 1861 ------------ .../20260410-105605-341eb1cf5caa.md | 2544 ---------------- .../20260410-105744-60a847d31356.md | 649 ---- .../20260410-112313-5e81a827ea36.md | 326 -- .../20260410-115411-d8eee7186d3c.md | 1566 ---------- .../20260410-120145-6928a618382d.md | 1538 ---------- ...bd9.md => 20260410-130611-31bb5d20c67b.md} | 22 +- ...840.md => 20260410-131717-21b9ef59fe19.md} | 50 +- .../20260413-185533-2ffc120d1d63.md | 164 + .../20260414-123147-7612de47e98e.md | 164 + .../20260414-123804-48a26f1d804d.md | 164 + .../20260414-124623-1c113368d81d.md | 2638 ++++++++++++++++ .../20260414-131913-a3d17a641da2.md | 2650 +++++++++++++++++ src/app/core/agent/__init__.py | 10 +- src/app/core/agent/processes/__init__.py | 20 +- src/app/core/agent/processes/v2/__init__.py | 6 +- .../agent/processes/v2/doc_rules_v2/README.md | 27 - .../common-elements/api-contract.md | 24 - .../doc_rules_v2/common-elements/details.md | 13 - .../v2/doc_rules_v2/common-elements/fr.md | 37 - .../common-elements/requirements-format.md | 16 - .../doc_rules_v2/common-elements/summary.md | 13 - .../common-elements/tech-use-case.md | 66 - .../v2/doc_rules_v2/documentation-rules.md | 71 - .../global/documentation-system.md | 38 - .../v2/doc_rules_v2/global/frontmatter.md | 67 - .../v2/doc_rules_v2/global/linking.md | 33 - .../v2/doc_rules_v2/global/naming.md | 24 - .../v2/doc_rules_v2/global/writing-style.md | 19 - .../templates/api_method.template.md | 84 - .../architecture_overview.template.md | 48 - .../templates/domain_entity.template.md | 48 - .../templates/logic_block.template.md | 50 - .../templates/ui_page.template.md | 50 - .../v2/doc_rules_v2/types/api_method.md | 39 - .../types/architecture_overview.md | 31 - .../v2/doc_rules_v2/types/domain_entity.md | 30 - .../v2/doc_rules_v2/types/integration_doc.md | 25 - .../v2/doc_rules_v2/types/logic_block.md | 31 - .../v2/doc_rules_v2/types/ui_page.md | 24 - .../README.md | 9 + .../attribute_resolution.md | 5 + .../path_resolution.md | 7 + .../section_details.md | 3 + .../section_frontmatter.md | 4 + .../section_summary.md | 3 + src/app/core/agent/processes/v2/v2_process.py | 29 +- .../doc_update_from_feature_v2/__init__.py | 11 + .../doc_update_from_feature_v2/graph.py | 43 + .../steps/__init__.py | 1 + .../steps/step1_resolve_source/__init__.py | 1 + .../steps/step1_resolve_source/step.py | 54 + .../step2_load_source_content/__init__.py | 1 + .../steps/step2_load_source_content/step.py | 54 + .../step3_parse_requirements/__init__.py | 1 + .../steps/step3_parse_requirements/parser.py | 168 ++ .../steps/step3_parse_requirements/step.py | 56 + .../steps/step4_load_rules/__init__.py | 1 + .../steps/step4_load_rules/step.py | 57 + .../steps/step4_prepare_tasks/__init__.py | 5 + .../steps/step4_prepare_tasks/services.py | 89 + .../steps/step4_prepare_tasks/step.py | 66 + .../step5_execute_subprocesses/__init__.py | 1 + .../step5_execute_subprocesses/classifier.py | 17 + .../path_resolver.py | 16 + .../prompts/prompts.yml | 11 + .../step5_execute_subprocesses/services.py | 225 ++ .../steps/step5_execute_subprocesses/step.py | 59 + .../steps/step6_finalize/__init__.py | 1 + .../steps/step6_finalize/step.py | 58 + .../subprocesses/__init__.py | 1 + .../subprocesses/common/__init__.py | 10 + .../subprocesses/common/document_composer.py | 33 + .../subprocesses/common/models.py | 12 + .../subprocesses/common/rules_catalog.py | 36 + .../subprocesses/common/source_sections.py | 56 + .../subprocesses/common/template_models.py | 28 + .../subprocesses/common/template_parser.py | 83 + .../subprocesses/common/template_registry.py | 23 + .../subprocesses/create_doc/__init__.py | 5 + .../subprocesses/create_doc/process.py | 46 + .../subprocesses/create_doc/steps/__init__.py | 1 + .../step1_generate_frontmatter/__init__.py | 1 + .../prompts/prompts.yml | 8 + .../steps/step1_generate_frontmatter/step.py | 49 + .../steps/step2_generate_sections/__init__.py | 5 + .../prompts/prompts.yml | 11 + .../steps/step2_generate_sections/step.py | 91 + .../steps/step2_generate_summary/__init__.py | 1 + .../prompts/prompts.yml | 7 + .../steps/step2_generate_summary/step.py | 38 + .../steps/step3_generate_details/__init__.py | 1 + .../prompts/prompts.yml | 7 + .../steps/step3_generate_details/step.py | 38 + .../steps/step4_compose_document/__init__.py | 1 + .../steps/step4_compose_document/step.py | 16 + .../subprocesses/delete_doc/__init__.py | 5 + .../subprocesses/delete_doc/process.py | 15 + .../subprocesses/delete_doc/steps/__init__.py | 1 + .../steps/step1_build_change/__init__.py | 1 + .../steps/step1_build_change/step.py | 9 + .../subprocesses/edit_doc/__init__.py | 3 + .../subprocesses/edit_doc/process.py | 59 + .../subprocesses/edit_doc/steps/__init__.py | 1 + .../step1_generate_frontmatter/__init__.py | 1 + .../prompts/prompts.yml | 7 + .../steps/step1_generate_frontmatter/step.py | 49 + .../steps/step2_generate_sections/__init__.py | 5 + .../prompts/prompts.yml | 9 + .../steps/step2_generate_sections/step.py | 91 + .../steps/step2_generate_summary/__init__.py | 1 + .../prompts/prompts.yml | 7 + .../steps/step2_generate_summary/step.py | 39 + .../steps/step3_generate_details/__init__.py | 1 + .../prompts/prompts.yml | 7 + .../steps/step3_generate_details/step.py | 39 + .../steps/step4_compose_document/__init__.py | 1 + .../steps/step4_compose_document/step.py | 16 + .../workflow_runtime/__init__.py | 1 + .../workflow_runtime/buffered_graph.py | 112 + .../workflow_runtime/context.py | 36 + .../workflow_runtime/models.py | 62 + src/app/core/application.py | 12 + .../runtime/v2_process_adapter.py | 10 + ...t_doc_update_from_feature_v2_happy_path.py | 236 ++ 180 files changed, 9397 insertions(+), 33226 deletions(-) create mode 100644 _process/04. Analitycs artefacts - documentation.md create mode 100644 _process/04. Analitycs artefacts - features.md delete mode 100644 _process/04. Analitycs artefacts.md create mode 100644 _process/05. MVP - process_v2.1.md create mode 100644 _process/doc_rules_v3/README.md create mode 100644 _process/doc_rules_v3/common-elements/api-contract.md create mode 100644 _process/doc_rules_v3/common-elements/db-columns.md create mode 100644 _process/doc_rules_v3/common-elements/db-constraints.md create mode 100644 _process/doc_rules_v3/common-elements/db-purpose.md create mode 100644 _process/doc_rules_v3/common-elements/db-usage.md create mode 100644 _process/doc_rules_v3/common-elements/details.md create mode 100644 _process/doc_rules_v3/common-elements/fr.md create mode 100644 _process/doc_rules_v3/common-elements/nfr.md create mode 100644 _process/doc_rules_v3/common-elements/sql-example.md create mode 100644 _process/doc_rules_v3/common-elements/summary.md create mode 100644 _process/doc_rules_v3/common-elements/tech-use-case.md create mode 100644 _process/doc_rules_v3/common-elements/ui-requirements.md create mode 100644 _process/doc_rules_v3/common-elements/user-analytics.md create mode 100644 _process/doc_rules_v3/documentation-rules.md create mode 100644 _process/doc_rules_v3/global/analytics-to-doc.md create mode 100644 _process/doc_rules_v3/global/filepaths.md create mode 100644 _process/doc_rules_v3/global/frontmatter.md create mode 100644 _process/doc_rules_v3/global/header-rules.md create mode 100644 _process/doc_rules_v3/global/layer-responsibility.md create mode 100644 _process/doc_rules_v3/templates/api_method.template.md create mode 100644 _process/doc_rules_v3/templates/db_table.template.md create mode 100644 _process/doc_rules_v3/templates/logic_block.template.md create mode 100644 _process/doc_rules_v3/templates/ui_page.template.md delete mode 100644 runtime_traces/agent_requests/20260408-095601-28fa24cfdd8f.md delete mode 100644 runtime_traces/agent_requests/20260408-130754-c008300db553.md delete mode 100644 runtime_traces/agent_requests/20260408-130830-d398ef674b67.md delete mode 100644 runtime_traces/agent_requests/20260408-131217-d6aef7712b50.md delete mode 100644 runtime_traces/agent_requests/20260408-133710-3fcdfdcab8be.md delete mode 100644 runtime_traces/agent_requests/20260408-134243-ae814cadec74.md delete mode 100644 runtime_traces/agent_requests/20260408-135621-3d42c447c174.md delete mode 100644 runtime_traces/agent_requests/20260408-135847-14bbe60d0cc3.md delete mode 100644 runtime_traces/agent_requests/20260408-144949-393097ecb1c4.md delete mode 100644 runtime_traces/agent_requests/20260408-161523-4e5327abba47.md delete mode 100644 runtime_traces/agent_requests/20260408-162001-36267a366e93.md delete mode 100644 runtime_traces/agent_requests/20260409-072516-8165fa8703a6.md delete mode 100644 runtime_traces/agent_requests/20260409-072648-48cbd7c792dd.md delete mode 100644 runtime_traces/agent_requests/20260409-143441-a16face9a0ab.md delete mode 100644 runtime_traces/agent_requests/20260409-143722-a9b20eb67e95.md delete mode 100644 runtime_traces/agent_requests/20260409-145546-36056dd8dcfe.md delete mode 100644 runtime_traces/agent_requests/20260409-151154-b91584f20703.md delete mode 100644 runtime_traces/agent_requests/20260409-151329-2d1087092e43.md delete mode 100644 runtime_traces/agent_requests/20260409-151338-51ca80f9145e.md delete mode 100644 runtime_traces/agent_requests/20260409-151841-faa90484f29c.md delete mode 100644 runtime_traces/agent_requests/20260409-152858-906a9a1ffd45.md delete mode 100644 runtime_traces/agent_requests/20260409-153809-3f140269bb3f.md delete mode 100644 runtime_traces/agent_requests/20260409-160321-c0c145c3b5d3.md delete mode 100644 runtime_traces/agent_requests/20260409-160845-116dcbbcf50b.md delete mode 100644 runtime_traces/agent_requests/20260409-173834-30e34019284e.md delete mode 100644 runtime_traces/agent_requests/20260410-072618-f641b32d79e2.md delete mode 100644 runtime_traces/agent_requests/20260410-085902-560bc90e200f.md delete mode 100644 runtime_traces/agent_requests/20260410-090548-70665e6dd3a5.md delete mode 100644 runtime_traces/agent_requests/20260410-105605-341eb1cf5caa.md delete mode 100644 runtime_traces/agent_requests/20260410-105744-60a847d31356.md delete mode 100644 runtime_traces/agent_requests/20260410-112313-5e81a827ea36.md delete mode 100644 runtime_traces/agent_requests/20260410-115411-d8eee7186d3c.md delete mode 100644 runtime_traces/agent_requests/20260410-120145-6928a618382d.md rename runtime_traces/agent_requests/{20260410-121449-0ddfbe598bd9.md => 20260410-130611-31bb5d20c67b.md} (90%) rename runtime_traces/agent_requests/{20260410-121324-7cbccb7c5840.md => 20260410-131717-21b9ef59fe19.md} (83%) create mode 100644 runtime_traces/agent_requests/20260413-185533-2ffc120d1d63.md create mode 100644 runtime_traces/agent_requests/20260414-123147-7612de47e98e.md create mode 100644 runtime_traces/agent_requests/20260414-123804-48a26f1d804d.md create mode 100644 runtime_traces/agent_requests/20260414-124623-1c113368d81d.md create mode 100644 runtime_traces/agent_requests/20260414-131913-a3d17a641da2.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/README.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/common-elements/api-contract.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/common-elements/details.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/common-elements/fr.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/common-elements/requirements-format.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/common-elements/summary.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/common-elements/tech-use-case.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/documentation-rules.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/global/documentation-system.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/global/frontmatter.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/global/linking.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/global/naming.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/global/writing-style.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/templates/api_method.template.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/templates/architecture_overview.template.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/templates/domain_entity.template.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/templates/logic_block.template.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/templates/ui_page.template.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/types/api_method.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/types/architecture_overview.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/types/domain_entity.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/types/integration_doc.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/types/logic_block.md delete mode 100644 src/app/core/agent/processes/v2/doc_rules_v2/types/ui_page.md create mode 100644 src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/README.md create mode 100644 src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/attribute_resolution.md create mode 100644 src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/path_resolution.md create mode 100644 src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_details.md create mode 100644 src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_frontmatter.md create mode 100644 src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_summary.md create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/graph.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step1_resolve_source/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step1_resolve_source/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step2_load_source_content/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step2_load_source_content/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/parser.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_load_rules/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_load_rules/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/services.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/classifier.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/path_resolver.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/prompts/prompts.yml create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/services.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step6_finalize/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step6_finalize/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/document_composer.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/models.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/rules_catalog.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/source_sections.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_models.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_parser.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_registry.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/process.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/prompts/prompts.yml create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/prompts/prompts.yml create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/prompts/prompts.yml create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/prompts/prompts.yml create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step4_compose_document/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step4_compose_document/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/process.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/step1_build_change/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/step1_build_change/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/process.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/prompts/prompts.yml create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/prompts/prompts.yml create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/prompts/prompts.yml create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/prompts/prompts.yml create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step4_compose_document/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step4_compose_document/step.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/buffered_graph.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/context.py create mode 100644 src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/models.py create mode 100644 tests/unit_tests/agent/test_doc_update_from_feature_v2_happy_path.py diff --git a/_process/04. Analitycs artefacts - documentation.md b/_process/04. Analitycs artefacts - documentation.md new file mode 100644 index 0000000..714c098 --- /dev/null +++ b/_process/04. Analitycs artefacts - documentation.md @@ -0,0 +1,289 @@ +## 1. Формат ведения технической документации агентом + +## 1.1. Общие принципы + +Техническая документация, формируемая агентом, должна строиться как система атомарных, не пересекающихся по смыслу документов, связанных между собой явными ссылками. + +Ключевые принципы: +- один документ описывает одну сущность или один устойчивый технический аспект; +- документ не должен дублировать соседние документы; +- общая система знаний должна собираться через ссылки, а не через копипасту; +- структура документации должна быть пригодна как для чтения человеком, так и для индексирования в RAG. + +## 1.2. Требования к заголовкам + +- Заголовок должен отражать только суть раздела. +- Заголовок не должен содержать метаданные (`id`, `doc_type`, `application`, `platform`, `domain`, `sub_domain`). +- Метаданные указываются отдельными строками в теле раздела или в YAML frontmatter. + +Пример: +- правильно: `## 6.2 Метод UFS получения списка заказов` +- неправильно: `## 6.2 Блок api_method (id=..., platform=ufs)` + +## 1.3. Базовые типы документных единиц + +Базовые типы: +- `ui_page` +- `api_method` +- `logic_block` + +Дополнительно могут использоваться: +- `architecture_overview` +- `integration_doc` +- `domain_entity` +- `glossary_item` +- `index_page` + +## 1.4. Принцип декомпозиции страниц / файлов + +### Один устойчивый объект - один документ +Если объект можно переиспользовать или на него могут ссылаться другие документы, его нужно выносить в отдельный файл. + +### Документы не должны пересекаться по смыслу +Если описание повторяется в нескольких местах, нужно выделять общий документ и ссылаться на него. + +### Use case и детали живут раздельно +Сценарий описывает поток работы, а детали выносятся в функциональные требования, отдельные блоки логики или контрактные описания. + +## 1.5. Иерархическая организация документации + +Документация должна быть организована как иерархическое дерево каталогов и файлов. + +Пример: + +```text +docs/ + ui/ + api/ + logic/ + domains/ + integrations/ + architecture/ + glossary/ + errors/ +``` + +## 1.6. Учет связей между документами + +Связи должны быть явными. + +Примеры: +- UI-страница ссылается на вызываемые API; +- API-документ ссылается на используемые блоки логики; +- логический блок ссылается на интеграции; +- документ по коду ссылается на системную аналитику, инициировавшую изменения. + +## 1.7. Формат markdown-документов + +Каждый документ состоит из: +1. YAML frontmatter; +2. Markdown body. + +## 1.8. YAML frontmatter + +### Обязательные поля +- `id` +- `title` +- `doc_type` +- `status` +- `domain` +- `sub_domain` +- `related_docs` + +### Рекомендуемые поля +- `owner` +- `entities` +- `tags` +- `feature` +- `system_analytics_refs` +- `source_of_truth` +- `related_code` + +### Допустимые значения `doc_type` +- `ui_page` +- `api_method` +- `logic_block` +- `architecture_overview` +- `integration_doc` +- `domain_entity` +- `glossary_item` +- `index_page` + +### Допустимые значения `status` +- `draft` +- `in_review` +- `approved` +- `outdated` +- `generated` +- `active` + +## 1.9. Синхронизация с системной аналитикой + +Техническая документация строится на основе системной аналитики (features). + +Обязательно учитывать: +- концептуальный уровень аналитики; +- детализацию технической документации; +- согласованность терминов, ролей и интеграционных цепочек. + +Если атрибуты или детали отсутствуют в аналитике: +- определить их из текста аналитики; +- дополнить данными из репозитория (код, контракты, существующие документы); +- зафиксировать итог в документации как явные метаданные и требования. + +## 1.10. Формат body-разделов для блока изменений + +Для секции изменений (по аналогии с разделом `6` в аналитике) использовать единый формат. + +Под корнем секции изменений указывать общие атрибуты: +- `domain` +- `sub_domain` + +Для каждого подраздела `X.Y` указывать метаданные строками сразу после заголовка: +- `id` +- `doc_type` +- `application` +- `platform` + +## 1.11. Различие аналитики и документации + +- Аналитика - концептуальный уровень, упрощенный use case. +- Документация - детальный инженерный уровень. + +Для документации: +- технический use case должен быть детализированным; +- функциональные требования расширяют use case и описывают детали интеграций, логики и поведения; +- функциональные требования не должны копировать шаги сценария без добавления новой информации. + +Источник правил: +- `src/app/core/agent/processes/v2/doc_rules_v2/common-elements/tech-use-case.md` +- `src/app/core/agent/processes/v2/doc_rules_v2/common-elements/fr.md` + +## 1.12. Требования к `ui_page` + +Обязательная структура: +- `### Технический use case` +- `### Требования к UI` +- `### Функциональные требования` +- `### Нефункциональные требования` + +### Требования к UI +Внутри обязательно отдельно описывать каждую форму UI: +- табличное представление; +- пустой список (empty state); +- ошибка (error state). + +Обязательные правила: +- если есть интеграция, обязательно описать показ ошибки; +- если показывается список, обязательно описать показ отсутствия данных. + +### UI-элементы +UI-поля и элементы в документации описываются строго в таблицах. + +Обязательные колонки (заполнять там, где применимо): +- `Код элемента` +- `Название и описание` +- `Данные` +- `Поведение` +- `Валидация` + +## 1.13. Пользовательская аналитика для `ui_page` + +События пользовательской аналитики оформляются таблицей: +- `Название события` +- `Описание` +- `Точка вызова` +- `Payload` + +## 1.14. Требования к `api_method` + +Обязательная структура: +- `### Технический use case` +- `### Функциональные требования` +- `### Нефункциональные требования` +- `### Контракт` + +### Технический use case +Оформляется детально по правилам `tech-use-case.md`. + +Обязательные части: +- название +- предусловия +- триггер +- основной сценарий +- альтернативный сценарий +- обработка ошибок +- постусловие + +### Функциональные требования +Оформляются по правилам `fr.md`: +- формат `FR.<номер>. <Название>`; +- FR расширяют use case; +- FR не дублируют шаги сценария без дополнительной ценности; +- для интеграционных шагов FR обязательны. + +## 1.15. Нефункциональные требования для `api_method` + +Разделять на подразделы: +- `#### Аудит` (если применимо) +- `#### Мониторинг` + +### Мониторинг +Оформлять таблицей: +- `Метрика` +- `Описание` +- `Условие срабатывания` + +Правила: +- в условиях указывать, при каких состояниях фиксируется событие; +- не использовать формулировку вида «точка измерения = метод»; +- базово закладывать метрики: + - `_SUCCESS` + - `_FAIL` + - `_BUSINESS_ERROR` + +## 1.16. Распределение ответственности по слоям + +- Проверка ролевой модели пользователя обычно выполняется в `ufs`. +- Для `pprb` аудит может не фиксироваться, если это согласовано правилами домена. +- Если проверка ролей вынесена в `ufs`, не дублировать этот шаг в use case `pprb`. + +## 1.17. Контракты API + +Контракт может быть: +- в markdown-таблицах; +- в OpenAPI; +- в отдельном контрактном файле. + +Для markdown-контракта минимум: +- endpoint/method; +- request fields; +- required/optional; +- constraints; +- response; +- errors; +- auth; +- retry; +- timeout; +- idempotency. + +## 1.18. Integrations-блок + +Если у документа есть интеграции, выделять отдельный `## Integrations`. + +Рекомендуемые атрибуты интеграции: +- `target` +- `target_type` +- `direction` +- `interaction` +- `via` +- `purpose` +- `details` + +## 1.19. Общие требования к markdown body + +- В документе должен быть один `H1`, совпадающий с `title`. +- Основные разделы - `H2`, подразделы - `H3`. +- Не допускать хаотичной вложенности заголовков. +- Вместо дублирования использовать ссылки на связанные документы. +- Сценарии, правила, ограничения и кодовые привязки держать раздельно. diff --git a/_process/04. Analitycs artefacts - features.md b/_process/04. Analitycs artefacts - features.md new file mode 100644 index 0000000..2e41b24 --- /dev/null +++ b/_process/04. Analitycs artefacts - features.md @@ -0,0 +1,185 @@ +# Системная аналитика + +## Общее описание + +Документ описывает изменения в автоматизированной системе. Пишется системными аналитиками для разработчиков и тестировщиков и проходит согласование с экспертами по архитектуре, безопасности и сопровождению. + +Документ может описывать как новый процесс, так и инкремент доработки существующей функциональности. + +## Требования к заголовкам + +- Заголовок должен отражать суть раздела. +- Заголовок не должен содержать лишнюю информацию, которая относится к метаданным (id, doc_type, platform, application и т.д.). +- Метаданные указываются отдельными строками в теле раздела. + +## Состав документа + +Каждый раздел верхнего уровня оформляется заголовком уровня `#`. + +### 1. Цели + +- Коротко описать, какую проблему и для кого решаем. +- 1-2 предложения. +- Не дублировать критерии приемки. + +### 2. Процесс AS IS и TO BE + +- Фокус на пользовательских и бизнес-изменениях. +- Не указывать технические детали (платформы, API, внутренние интеграции). + +### 3. Ограничения + +- Ограничения и допущения в техническом и бизнесовом плане. + +### 4. Критерии приемки + +- Описывать с точки зрения пользователя. +- Не добавлять технические детали (платформы, API, внутренние компоненты). + +### 5. Архитектура + +Нужно указать: + +- схему контейнеров, +- таблицу интеграций, +- сквозные интеграционные сценарии. + +Слои: + +- `ui` - web-приложение, клиент. +- `ufs` - BFF: аутентификация/авторизация, агрегация и маппинг данных. +- `pprb` - backend: API, БД, логика жизненного цикла сущностей. + +#### Диаграмма + +Mermaid-диаграмма должна содержать: + +- основные контейнеры, +- названия приложений и платформ, +- интеграции между приложениями, +- названия вызываемых endpoint или топиков. + +#### Таблица интеграций + +Обязательные колонки: + +- Код +- Название endpoint/топика +- Источник данных +- Потребитель данных +- Инициатор вызова +- Передаваемые данные + +#### Сквозной интеграционный сценарий + +- Нумерованный список вызовов вида: «Компонент 1 вызывает endpoint в Компонент 2». +- Только интеграционная цепочка, без детального разбора логики. + +### 6. Описание изменений + +Раздел состоит из подразделов уровня `##` (например, `6.1`, `6.2`, `6.3`). + +Под корнем раздела `# 6` указываются общие метаданные: + +- `domain` +- `sub_domain` + +Для каждого раздела `6.x` обязательно указывать метаданные строками сразу после заголовка: + +- `id` +- `doc_type` +- `application` +- `platform` + +#### 6.x для `ui_page` + +Обязательная структура: + +- `### Технический use case (тезисно)` +- `### Требования к UI` +- `### Функциональные требования` +- `### Нефункциональные требования` + +Требования к разделу `### Требования к UI`: + +- Внутри нужно отдельно описывать каждую UI-форму. +- Если есть интеграция, обязательно описать, как показывается ошибка. +- Если показываем список, обязательно описать, как показывается отсутствие данных. + +Рекомендуемая детализация UI-форм: + +- табличное представление, +- пустой список (empty state), +- ошибка (error state). + +Правила описания UI-полей: + +- Поля описывать списком (не таблицей). +- Общие правила (например, read-only, поведение при пустом значении) выносить в общий блок, не дублировать для каждого поля. + +Нефункциональные требования для `ui_page`: + +- пользовательская аналитика оформляется таблицей с колонками: + - `Название события` + - `Описание` + - `Точка вызова` + - `Payload` + +#### 6.x для `api_method` + +Обязательная структура: + +- `### Технический use case (тезисно)` +- `### Функциональные требования` +- `### Нефункциональные требования` +- `### Контракт метода` + +Правило для функциональных требований: + +- Если дополнительных требований нет (дублируют сценарий), писать: `Не выявлены`. + +Нефункциональные требования: + +- Разделять на подразделы: + - `#### Аудит` (если применимо) + - `#### Мониторинг` + +Для `Мониторинг` использовать таблицу с колонками: + +- `Метрика` +- `Описание` +- `Условие срабатывания` + +Важно: + +- В мониторинге описывать условия срабатывания, а не «точку измерения = метод». +- Базово закладывать 3 метрики: + - `_SUCCESS` + - `_FAIL` + - `_BUSINESS_ERROR` + +Контракт метода: + +- Для запроса: таблица параметров (`header/query/path`) с колонками: название, тип параметра, тип данных, обязательность, описание, пример. +- Для тела JSON (если есть): структура отдельной таблицей. +- Для ответа JSON: таблица с колонками: название, тип данных, обязательность, описание, заполнение, пример. + +#### 6.x для `logic_block` + +Обязательная структура: + +- `### Технический use case (тезисно)` +- `### Функциональные требования` +- `### Нефункциональные требования` + +## Дополнительные правила по слоям + +- Проверка ролевой модели пользователя обычно выполняется на уровне `ufs`. +- Для `pprb` аудит может не фиксироваться, если это правило принято для конкретной фичи/домена. +- Если проверка ролей вынесена в `ufs`, не дублировать этот шаг в сценарии `pprb`. + +## Термины + +- Аудит: события, которые фиксируют действия пользователя и позволяют ответить на вопрос «кто, что, когда сделал». +- Мониторинг: технические события/метрики для контроля стабильности и поиска сбоев. + diff --git a/_process/04. Analitycs artefacts.md b/_process/04. Analitycs artefacts.md deleted file mode 100644 index 2415f32..0000000 --- a/_process/04. Analitycs artefacts.md +++ /dev/null @@ -1,852 +0,0 @@ -## 1. Формат ведения технической документации агентом - -## 1.1. Общие принципы - -Техническая документация, формируемая агентом, должна строиться как **система атомарных, не пересекающихся по смыслу документов**, связанных между собой явными ссылками. - -Ключевые принципы: -- один документ описывает одну сущность или один устойчивый технический аспект; -- документ не должен дублировать соседние документы; -- общая система знаний должна собираться через ссылки, а не через копипасту; -- структура документации должна быть пригодна как для чтения человеком, так и для индексирования в RAG. - -## 1.2. Базовые типы документных единиц - -На первом этапе логично сохранить текущую семантику типов документов, но перенести ее в файловую модель. - -Базовые типы: -- `ui_page` -- `api_method` -- `logic_block` - -Позже могут добавиться: -- `architecture_overview` -- `integration_doc` -- `domain_entity` -- `glossary_item` -- `index_page` - -## 1.3. Принцип декомпозиции страниц / файлов - -### Один устойчивый объект — один документ -Если объект можно переиспользовать или на него могут ссылаться другие документы, его надо выносить в отдельный файл. - -Примеры: -- отдельная UI-страница; -- отдельный API endpoint; -- отдельный блок логики; -- отдельный интеграционный сценарий. - -### Документы не должны пересекаться по смыслу -Если описание повторяется в нескольких местах, нужно выделять общий документ и ссылаться на него. - -Примеры: -- фронтальная страница не должна заново описывать логику API; -- документ по API не должен заново раскрывать общую логику переиспользуемого блока; -- вместо дублирования должен быть переход по ссылке. - -### Use case и детальные правила живут раздельно -Сценарий описывает поток работы, а детали выносятся в функциональные требования, отдельные блоки логики или контрактные описания. - -Это важно и для RAG-индексации: -- сценарии индексируются как workflows; -- отдельные правила — как facts; -- сущности и блоки — как entities. - -## 1.4. Иерархическая организация документации - -Документация должна быть организована как иерархическое дерево каталогов и файлов, а не как набор неструктурированных страниц. - -Пример верхнего уровня: - -```text -docs/ - ui/ - api/ - logic/ - domains/ - integrations/ - architecture/ - glossary/ - errors/ -``` - -Пример организации: - -```text -docs/ - ui/ - order-create-page.md - order-edit-page.md - api/ - orders-create.md - orders-get.md - logic/ - order-validation.md - order-enrichment.md - architecture/ - system-overview.md - integration-landscape.md - errors/ - catalog.yaml -``` - -## 1.5. Учет связей между документами - -Связи должны быть **явными и поддерживаемыми агентом**. - -Примеры: -- UI-страница ссылается на API, который она вызывает; -- API-документ ссылается на переиспользуемые логические блоки; -- логический блок ссылается на связанные интеграции; -- архитектурный обзор ссылается на набор конкретных модулей и документов; -- документ по коду может ссылаться на системную аналитику, которая инициировала изменение. - -Именно эта сеть ссылок затем индексируется в слоях: -- `D1_DOCUMENT_CATALOG` -- `D3_ENTITY_CATALOG` -- `D4_WORKFLOW_INDEX` -- `D5_REFERENCE_GRAPH` -- `D6_DOC_CODE_LINKS` - -## 1.6. Формат markdown-документов - -Основной формат технической документации — `Markdown`. - -Каждый документ состоит из двух частей: -1. **YAML frontmatter** — структурные метаданные; -2. **Markdown body** — основное содержимое по шаблону. - -## 3.7. YAML frontmatter - -Frontmatter нужен для: -- определения типа документа; -- идентификации документа; -- определения его места в иерархии; -- фиксации связей с кодом и другими документами; -- выделения сущностей и тегов; -- упрощения построения слоев `D1`, `D3`, `D5`, `D6`. - -### Базовый frontmatter - -```yaml ---- -id: ui-order-create-page -title: Страница создания заказа -doc_type: ui_page -domain: orders -status: draft -related_docs: - - api-orders-create - - logic-order-validation -entities: - - Order - - CreateOrder -tags: - - ui - - orders - - creation -#owner: system-analyst -#source_of_truth: code -#related_code: -# - src/orders/ui/create_page.tsx -# - src/orders/api/orders_controller.py ---- -``` - -### Обязательные поля - -- `id` — стабильный уникальный идентификатор документа; -- `title` — человекочитаемый заголовок; -- `doc_type` — тип документа; -- `related_docs` — ссылки на связанные документы; -- `status` — статус документа; -- `domain` - домен фичи (Карточка клиента, Задачи, Сделки, Предложения) -- `sub_domain` - поддомен внутри основной сущности (Счета, ЗДА, ECM) - -### Рекомендуемые поля -- `owner` -- `entities` -- `tags` -- `parent` -- `children` -- `feature` -- `system_analytics_refs` -- `business_refs` -- `updated_from` -- `reviewers` -- `source_of_truth` -- `related_code` - -### Допустимые значения `doc_type` -- `ui_page` -- `api_method` -- `logic_block` -- `architecture_overview` -- `integration_doc` -- `domain_entity` -- `glossary_item` -- `index_page` - -### Допустимые значения `status` -- `draft` -- `in_review` -- `approved` -- `outdated` -- `generated` -- `active` - -### Допустимые значения `source_of_truth` -- `code` -- `doc` -- `system_analysis` -- `business_requirements` -- `mixed` - -## 1.8. Typed frontmatter для разных типов документов - -У каждого типа документа есть: -- **общие поля**; -- **тип-специфичные поля**. - -### Пример для `api_method` - -```yaml ---- -id: api.create_invoice -doc_type: api_method -domain: billing -title: Создание инвойса - -endpoint: POST /api/v1/invoices -auth: USER -idempotent: false -timeout_ms: 3000 - -links: - called_by: - - ui.invoice_form - uses_logic: - - logic.invoice_validation - writes_db: - - db.invoices - - db.invoice_items - integrates_with: - - int.crm_sync - -related_docs: - - ui.invoice_form - - logic.invoice_validation -related_code: - - services/billing/api/create_invoice.py -entities: - - Invoice - - CreateInvoice - -tags: - - invoice - - create - - billing -status: active -version: 1.3 -source_of_truth: code ---- -``` - -### Для `api_method` полезно поддерживать - -- `endpoint` -- `sup_parameters` -- `role_model_actions` -- `monitoring_actions` -- `audit_actions` -- `idempotent` -- `timeout_ms` -- `links.called_by` -- `links.uses_logic` -- `links.writes_db` -- `links.integrates_with` - -### Для `ui_page` позже полезно поддерживать -- `calls_api` -- `user_analitycs_actions` -- `sup_parameters` -- `role_model_actions` -- `entry_points` -- `uses_logic` - -### Для `logic_block` полезно поддерживать - -- `called_from` -- `uses_logic` -- `reads_db` -- `writes_db` -- `integrates_with` - -## 1.9. Двухслойная структура документа: `Summary` + `Details` - -LLM не должна каждый раз тонуть в полном документе. Поэтому каждый документ должен содержать два уровня представления. - -### `Summary` -Короткая, строго структурированная спецификация. Это слой **быстрого контекста**. - -Рекомендуемый объем: -- примерно 30–60 строк; -- без длинных пояснений; -- только ключевые факты. - -Пример: - -```md -## Summary -- Purpose: создание инвойса из формы -- Actor: пользователь -- Trigger: Submit -- Main API: POST /api/v1/invoices (api.create_invoice) -- Validation: required fields, amount > 0, date <= today -- Errors: 400(field errors), 409(duplicate), 503(retryable) -- Analytics: event invoice_submit, invoice_error -``` - -### `Details` -Полное раскрытие объекта: -- use case; -- функциональные требования; -- UI; -- API; -- integrations; -- ошибки; -- НФТ; -- связи; -- кодовые привязки. - -### Блок `## Integrations` - -Если у объекта есть интеграции, они должны быть выделены в отдельный блок `## Integrations`. -Интеграции не нужно дублировать во frontmatter. -Основное описание хранится в body документа. - -Ожидаемый принцип: -- одна интеграция = одна отдельная запись внутри блока; -- у интеграции есть краткое имя; -- у интеграции есть структурированные атрибуты; -- дополнительные детали допускаются в свободной форме через вложенный словарь. - -Рекомендуемые атрибуты интеграции: -- `target` -- `target_type` -- `direction` -- `interaction` -- `via` -- `purpose` -- `details` - -Где: -- `target` - идентификатор или имя целевого объекта; -- `target_type` - тип цели: `api`, `ui`, `entity`, `service`, `queue`, `db`, `external_system`; -- `direction` - направление: `inbound`, `outbound`, `bidirectional`; -- `interaction` - тип взаимодействия: `calls`, `reads`, `writes`, `emits`, `consumes`, `depends_on`; -- `via` - технический канал интеграции; -- `purpose` - зачем нужна интеграция; -- `details` - словарь с гибкой структурой под дополнительные параметры. - -Пример: - -```md -## Integrations - -### Orders API -- target: api.orders.create -- target_type: api -- direction: outbound -- interaction: calls -- via: POST /api/orders -- purpose: создание заказа -- details: - - auth: service-token - - retry: true - -### Order Entity -- target: domain.order -- target_type: entity -- direction: outbound -- interaction: writes -- via: repository -- purpose: сохранение состояния заказа -- details: - - transaction: required -``` - -Этот блок должен быть пригоден и для чтения человеком, и для последующего извлечения в отдельный RAG-слой интеграций. - -## 1.10. Общие требования к markdown body - -1. В документе должен быть один `H1`, совпадающий с `title`. -2. Основные разделы используют `H2`. -3. Подразделы внутри разделов используют `H3`. -4. Не должно быть хаотической вложенности заголовков. -5. Один раздел должен описывать одну смысловую часть. -6. Текст не должен дублировать соседние документы. -7. Вместо дублирования должны использоваться явные ссылки на связанные документы. -8. Сценарии, правила, ограничения и ссылки на код должны быть отделены друг от друга. - -## 1.11. Базовый каркас markdown-документа - -```md ---- -id: api-orders-create -title: Метод создания заказа -doc_type: api_method -domain: orders -status: draft -source_of_truth: code -related_docs: - - logic-order-validation - - ui-order-create-page -related_code: - - src/orders/api/create_order.py -entities: - - Order - - CreateOrder -tags: - - api - - orders ---- - -# Метод создания заказа - -## Summary -- Purpose: создание заказа -- Actor: пользователь -- Trigger: submit формы -- Main API: POST /orders - -## Details -### Описание -### Технический use case -### Функциональные требования -### Нефункциональные требования -### Контракт - - -## 3.13. Специализированные шаблоны документов - -### UI Page - -```md -# <Название страницы> - -## Summary -## Назначение -## Контекст -## Технический use case -## Описание UI -## UI Elements -## Функциональные требования -## Нефункциональные требования -## Связанные API -## Связанные блоки логики -## Связанный код -## Связанные документы -## История изменений -``` - -#### Требования к разделу `Описание UI` -Для каждого элемента желательно описывать: -- тип элемента; -- назначение; -- источник данных; -- default / placeholder; -- правила активации; -- поведение при взаимодействии; -- валидацию. - -#### Требования к разделу `UI Elements` -UI-элементы должны храниться в **табличном** или **полуструктурированном** виде. - -Пример: - -```md -## UI Elements - -| id | type | label | data_source | validation | behavior | -|--------|--------|---------|------------|------------|----------| -| amount | input | Amount | local | >0 | enables submit | -| submit | button | Create | - | - | calls api.create_invoice | -``` - -Если модель UI сложная, допустим sidecar-файл `ui_elements.yaml` или `ui_elements.json` рядом с основным документом. - -### API Method - -```md -# <Название API метода> - -## Summary -## Назначение -## Контекст -## Технический use case -## Функциональные требования -## Contract -## Integrations -## Errors -## Нефункциональные требования -## Связанные блоки логики -## Связанный код -## Связанные документы -## История изменений -``` - -#### Требования к разделу `Contract` -Контракт может: -- быть кратко описан прямо в документе; -- ссылаться на OpenAPI; -- ссылаться на отдельный контрактный файл. - -Для REST API целевым источником истины должен становиться `OpenAPI`. - -### Reusable Logic Block - -```md -# <Название блока логики> - -## Summary -## Назначение -## Контекст -## Технический use case -## Функциональные требования -## Integrations -## Ограничения и условия вызова -## Нефункциональные требования -## Связанные API / UI / integration points -## Связанный код -## Связанные документы -## История изменений -``` - -## 3.14. Машинно-читаемые API-контракты - -Для API контрактов **источником истины** должен становиться: -- `OpenAPI` — предпочтительно; -- либо временно строгий markdown/yaml-контракт, если OpenAPI еще нет. - -Минимальный набор для API-контракта: -- `endpoint` -- `method` -- `request fields` -- `required / optional` -- `constraints` -- `response` -- `errors` -- `idempotency` -- `retry` -- `timeout` -- `auth` - -## 3.15. Каталог ошибок - -Ошибки, HTTP-коды, retry-правила и клиентское поведение не должны размазываться по разным документам. - -Нужен единый каталог ошибок, например `docs/errors/catalog.yaml`. - -Пример: - -```yaml -errors: - - error_id: invoice_validation_failed - http_code: 400 - internal_code: BILLING_400_01 - when: invalid request fields - client_behavior: show field errors - retry: false - owner: billing - - - error_id: invoice_duplicate - http_code: 409 - internal_code: BILLING_409_01 - when: duplicate invoice detected - client_behavior: show duplicate warning - retry: false - owner: billing - - - error_id: crm_sync_unavailable - http_code: 503 - internal_code: BILLING_503_02 - when: downstream CRM unavailable - client_behavior: retry later - retry: true - owner: billing -``` - -В API- и logic-документах лучше ссылаться на `error_id`, а не заново подробно описывать каждую ошибку. - -## 3.16. Требования к качеству документа для RAG - -1. **Явные заголовки** — не использовать безымянные блоки текста. -2. **Атомарные утверждения** — не смешивать несколько правил в одном пункте, если их можно разделить. -3. **Явные сущности** — использовать стабильные названия компонентов, API, модулей, страниц. -4. **Явные ссылки** — не писать «этот метод», если можно указать конкретную ссылку или идентификатор. -5. **Минимум дублирования** — повторяющийся контент должен заменяться ссылками. -6. **Привязка к коду** — если документ описывает кодовый объект, это должно быть явно указано. -7. **Разделение сценариев и правил** — workflow и fact-like требования должны быть отделены. - -## 3.17. Как структура markdown помогает RAG - -- `frontmatter` + заголовки → `D1_DOCUMENT_CATALOG` -- `entities`, `tags`, устойчивые термины → `D3_ENTITY_CATALOG` -- атомарные функциональные и нефункциональные требования → `D2_FACT_INDEX` -- `Технический use case` → `D4_WORKFLOW_INDEX` -- `related_docs`, явные ссылки → `D5_REFERENCE_GRAPH` -- `related_code`, упоминания symbols и файлов → `D6_DOC_CODE_LINKS` -- `Summary` → быстрый retrieval и short-form context для LLM - -## 3.18. Принципы генерации документации агентом - -Когда документ пишет агент, он должен: -- сначала извлечь evidence из кода, системной аналитики и существующих документов; -- определить тип документа; -- заполнить frontmatter; -- построить markdown body по шаблону; -- явно указать связи с кодом и другими документами; -- не дублировать уже существующее описание, если можно сослаться на него. - ---- - - -## 4.4. Layered RAG - -RAG строится как система специализированных слоев для двух основных доменов: -- `CODE RAG` -- `DOCS RAG` - -Каждый graph извлекает контекст не из одного общего индекса, а из нужного набора слоев в зависимости от intent. - -## 4.5. Evidence gate - -Перед синтезом ответа или документа агент должен проверять, хватает ли опоры. - -Примеры: -- найден ли symbol; -- найдено ли достаточное количество code chunks; -- есть ли supporting relations; -- есть ли document evidence; -- есть ли docs ↔ code mapping. - -Если опоры недостаточно, агент должен: -- деградировать в упрощенный режим; -- честно фиксировать неполноту ответа; -- при необходимости уходить в fallback. - -## 4.6. Synthesis layer - -На этом этапе LLM: -- агрегирует найденные артефакты; -- формирует объяснение; -- пишет документ; -- структурирует результат под нужный шаблон. - -LLM не должна быть основным источником фактов. Фактическая основа должна приходить из RAG и диагностируемого pipeline. - -## 4.7. Diagnostics - -Система должна сохранять диагностический след: -- какой graph был выбран; -- какие слои использовались; -- что было найдено; -- где retrieval был слабым; -- почему был выбран fallback; -- какие evidence стали основой ответа. - -## 4.8. Сценарии: Target Architecture vs MVP-now - -### 4.8.1. Target Architecture - -#### CODE -- `OPEN_FILE` — открыть конкретный файл; -- `OPEN_SYMBOL` — открыть класс / функцию / метод; -- `EXPLAIN` — объяснить, как работает сущность или фрагмент; -- `FIND_TESTS` — найти релевантные тесты; -- `FIND_ENTRYPOINTS` — найти основные точки входа; -- `RELATED_CODE` — найти связанные сущности и ближайший контекст. - -#### DOCS -- `DOC_SEARCH` — найти релевантный фрагмент документации; -- `DOC_EXPLAIN` — кратко объяснить, что сказано в документации по теме; -- `DOC_ENTITY_LOOKUP` — найти разделы, связанные с сущностью или компонентом; -- `GENERATE_DOCS_FROM_CODE` — сформировать документацию по коду с нуля для модуля, класса, функции, компонента или сценария. - -#### CROSS-DOMAIN -- `FIND_IMPLEMENTATION_BY_DOC` — найти реализацию по описанию; -- `FIND_DOC_BY_CODE` — найти документацию по коду; -- `COMPARE_DOCS_AND_CODE` — базовое сопоставление документации и реализации. - -#### GENERAL / FALLBACK -- `GENERAL_QA` — общий сценарий ответа на вопрос, если домен или интент не удалось определить уверенно. - -### 4.8.2. MVP-now - -В текущем цикле фокус на сценариях: - -- `OPEN_FILE` -- `EXPLAIN` -- `FIND_TESTS` -- `FIND_ENTRYPOINTS` -- `GENERAL_QA` - -DOCS и CROSS_DOMAIN остаются частью target architecture; в текущем цикле они не являются обязательной частью test-first MVP. - ---- - -## 5. Структура слоев RAG - -## 5.1. CODE RAG - -### C0 — Source Chunks -**Назначение:** базовые фрагменты исходного кода. -**Единица:** chunk кода. -**Как формируется:** исходные файлы обходятся и режутся на chunk’и с учетом структурных границ. -**Статус в MVP:** да. - -### C1 — Symbol Catalog -**Назначение:** каталог модулей, классов, функций, методов и других значимых сущностей. -**Единица:** symbol. -**Как формируется:** из AST и синтаксического разбора кода. -**Статус в MVP:** да. - -### C2 — Symbol Relations -**Назначение:** связи между symbols. -**Единица:** relation. -**Как формируется:** вторым проходом по AST и структурным зависимостям. -**Статус в MVP:** да, в ограниченном виде. - -### C3 — Entrypoints -**Назначение:** каталог точек входа системы. -**Единица:** entrypoint. -**Как формируется:** специализированными детекторами entrypoint-паттернов. -**Статус в MVP:** да, минимально. - -### C4 — Execution Paths -**Назначение:** типовые пути исполнения. -**Единица:** path. -**Как формируется:** поверх `C2` и `C3` через производную трассировку. -**Статус в MVP:** нет. - -### C5 — Test Mappings -**Назначение:** связи production code ↔ tests. -**Единица:** mapping. -**Как формируется:** по путям, именам, импортам и конвенциям проекта. -**Статус в MVP:** да, минимально. - -### C6 — Code Facts -**Назначение:** нормализованные факты из кода. -**Единица:** fact. -**Как формируется:** поверх `C1–C3` как производный слой. -**Статус в MVP:** нет. - -## 5.2. DOCS RAG - -### D0 — Document Chunks -**Назначение:** базовые фрагменты документации. -**Единица:** document chunk. -**Как формируется:** документы нормализуются и режутся на chunk’и с сохранением `section path`. -**Статус в MVP:** да. - -### D1 — Document Catalog -**Назначение:** каталог документов и разделов. -**Единица:** `document node / section node`. -**Как формируется:** из структуры документов и их заголовков. -**Статус в MVP:** да. - -### D2 — Fact Index -**Назначение:** атомарные факты из документации. -**Единица:** fact. -**Как формируется:** из `D0/D1` через правила, шаблоны и при необходимости LLM extraction с валидацией. -**Статус в MVP:** частично. - -### D3 — Entity Catalog -**Назначение:** каталог сущностей и понятий документации. -**Единица:** entity / concept. -**Как формируется:** из устойчивых терминов, заголовков, словарей и нормализации повторяющихся сущностей. -**Статус в MVP:** да, минимально. - -### D4 — Workflow Index -**Назначение:** процедуры, сценарии, последовательности шагов. -**Единица:** workflow. -**Как формируется:** из use case, процессных разделов и последовательных описаний шагов. -**Статус в MVP:** нет. - -### D5 — Reference Graph -**Назначение:** граф ссылок между документами, секциями, сущностями и фактами. -**Единица:** reference link. -**Как формируется:** из явных и неявных cross-links между документами. -**Статус в MVP:** нет. - -### D6 — Doc-Code Links -**Назначение:** мост между документацией и кодом. -**Единица:** `doc artifact ↔ code artifact link`. -**Как формируется:** из имен, aliases, путей, устойчивых терминов и других надежных соответствий. -**Статус в MVP:** да, минимально. - -## 5.3. Layer scope: Target Architecture vs MVP-now - -### 5.3.1. Target Architecture - -Полная карта слоёв: - -- **CODE:** C0–C6 (Source Chunks, Symbol Catalog, Symbol Relations, Entrypoints, Execution Paths, Test Mappings, Code Facts) -- **DOCS:** D0–D6 (Document Chunks, Document Catalog, Fact Index, Entity Catalog, Workflow Index, Reference Graph, Doc-Code Links) - -### 5.3.2. MVP-now - -**Обязательные сейчас:** - -- `C0_SOURCE_CHUNKS` -- `C1_SYMBOL_CATALOG` -- `C2_SYMBOL_RELATIONS` -- `C3_ENTRYPOINTS` - -**В облегчённом виде:** - -- `C5_TEST_MAPPINGS` или `C5-lite` - -**Не блокируют текущий этап:** - -- `C4_EXECUTION_PATHS` -- `C6_CODE_FACTS` -- весь docs runtime (слои D0–D6 в исполнении runtime) - -Слои документации остаются частью target architecture; docs retrieval пока не обязателен для текущего code-first milestone. - ---- - -## 6. Итоговая рамка MVP-now - -Сейчас система должна стабильно работать в **test-first** режиме. - -**Фокус:** - -- CODE_QA; -- через тесты настраиваются: - - intent routing (IntentRouterV2); - - layered retrieval; - - evidence sufficiency; - - answer quality; - - diagnostics. - -**Не входят в текущий milestone:** - -- UI-интеграция; -- docs runtime; -- полная интеграция orchestration переносится на следующий этап после стабилизации test pipeline. - -В целевой архитектуре по-прежнему заложены: -- уверенная работа с кодом, symbols, entrypoints, тестами; -- ответ по документации и мост docs ↔ code; -- генерация документации по коду; -- fallback при неуверенном роутинге. - -В MVP-now сознательно **не включаются** самые дорогие части: -- полноценные execution paths для всей системы; -- богатые fact-индексы по всем доменам; -- полный reference graph документации; -- глубокая автоматизация подготовки системной аналитики. diff --git a/_process/05. MVP - process_v2.1.md b/_process/05. MVP - process_v2.1.md new file mode 100644 index 0000000..5676206 --- /dev/null +++ b/_process/05. MVP - process_v2.1.md @@ -0,0 +1,33 @@ +Нужно реализовать 2 вещи + +Создать процесс внесения изменений в файл документации +Создать контекст этого процесса + +Контекст наполнять атрибутами +что-то явно задано, фоллбэк через ллм + + + +Написать тестовую аналитику - круд над сущностью +фронт, ефс, ппрб +Все в своей БД +Атрибуты сущности задать в требованиях + + + + +Аналитика имеет структуру +Внутри модули - один модуль на правку одного файла. + + +Модуль извлекается из аналитики парсером и из него формируется задача на редактирование файла +если парсер не сработал - фоллбэк ан ллм + + + +Процесс редактирования работает стандартно + + + + + diff --git a/_process/doc_rules_v3/README.md b/_process/doc_rules_v3/README.md new file mode 100644 index 0000000..ba167b4 --- /dev/null +++ b/_process/doc_rules_v3/README.md @@ -0,0 +1,37 @@ +# Documentation Rules V3 + +Этот каталог содержит правила генерации технической документации из системной аналитики. + +## Цель +- синхронизировать требования к документации с требованиями к аналитике (`04. Analitycs artefacts - features.md`); +- сохранить детальность техдокументации по сравнению с аналитикой; +- убрать дублирование структуры и manifest-слоя между разными файлами; +- собирать итоговый промпт из модулей: глобальные правила + template с manifest + блоки. + +## Структура +- `documentation-rules.md` — верхнеуровневый регламент и порядок сборки. +- `global/` — общие правила (заголовки, frontmatter, слой ответственности, мост аналитика->документация). +- `common-elements/` — правила для общих блоков (`summary`, `details`, `use case`, `FR`, `NFR`, `UI`, `Contract`). +- `templates/` — единственный источник истины для структуры итоговой страницы и manifest-метаданных типа документа. + +## Принцип сборки +Для конкретного документа агент собирает единый набор правил из: +1. `documentation-rules.md` +2. `global/*.md` +3. `templates/.template.md` +4. `common-elements/*.md`, указанных в frontmatter template + +## Правило без дублирования +- `templates/` отвечают за структуру документа, порядок разделов и manifest-метаданные типа. +- `common-elements/` отвечают только за правила написания конкретного раздела. +- отдельный слой `types/` не нужен, если для типа документа используется один основной template. + +## Формат template-manifest +Manifest оформляется в YAML frontmatter самого template. + +Обязательные поля manifest: +- `doc_type` +- `required_common_elements` + +Рекомендуемые поля: +- `special_rules` diff --git a/_process/doc_rules_v3/common-elements/api-contract.md b/_process/doc_rules_v3/common-elements/api-contract.md new file mode 100644 index 0000000..2070782 --- /dev/null +++ b/_process/doc_rules_v3/common-elements/api-contract.md @@ -0,0 +1,21 @@ +# API Contract Rules + +## Обязательные части +- request parameters (`header/query/path`) +- request body (если применимо) +- response body +- errors +- auth +- timeout +- retry/idempotency (если применимо) + +## Табличный формат +Для request/response таблицы должны содержать: +- название +- тип данных +- обязательность +- описание +- пример + +Для response дополнительно: +- заполнение (mapping/логика источника данных) diff --git a/_process/doc_rules_v3/common-elements/db-columns.md b/_process/doc_rules_v3/common-elements/db-columns.md new file mode 100644 index 0000000..5fb7f0a --- /dev/null +++ b/_process/doc_rules_v3/common-elements/db-columns.md @@ -0,0 +1,17 @@ +# DB Columns Rules + +## Формат +Структура таблицы оформляется таблицей. + +## Обязательные колонки +- `Поле` +- `Тип` +- `Nullable` +- `Описание` +- `Источник заполнения` +- `Использование` + +## Правила +- перечислять все ключевые поля таблицы; +- для служебных полей (`id`, `created_at`, `updated_at`, `deleted_at`) явно описывать назначение; +- если тип или nullable не заданы в аналитике, допускается инженерное предположение с рабочим вариантом. diff --git a/_process/doc_rules_v3/common-elements/db-constraints.md b/_process/doc_rules_v3/common-elements/db-constraints.md new file mode 100644 index 0000000..9cacbf0 --- /dev/null +++ b/_process/doc_rules_v3/common-elements/db-constraints.md @@ -0,0 +1,16 @@ +# DB Constraints Rules + +## Что включать +- primary key; +- unique constraints; +- foreign keys; +- важные индексы; +- бизнес-ограничения на уровне БД. + +## Формат +- списком или таблицей; +- для каждого индекса и ограничения писать, зачем оно нужно. + +## Правила +- если индекс нужен для сценария чтения/пагинации, это должно быть явно сказано; +- если точные названия индексов неизвестны, можно использовать осмысленные проектные названия. diff --git a/_process/doc_rules_v3/common-elements/db-purpose.md b/_process/doc_rules_v3/common-elements/db-purpose.md new file mode 100644 index 0000000..c965a3b --- /dev/null +++ b/_process/doc_rules_v3/common-elements/db-purpose.md @@ -0,0 +1,12 @@ +# DB Table Purpose Rules + +## Что описывать +- назначение таблицы; +- в каком сценарии она используется; +- кто является владельцем данных; +- является ли таблица источником истины или производным хранилищем. + +## Формат +- 1-3 абзаца без воды; +- явно указывать доменную сущность, которую хранит таблица; +- если сделаны допущения по БД, фиксировать их отдельной фразой. diff --git a/_process/doc_rules_v3/common-elements/db-usage.md b/_process/doc_rules_v3/common-elements/db-usage.md new file mode 100644 index 0000000..6d7ab2e --- /dev/null +++ b/_process/doc_rules_v3/common-elements/db-usage.md @@ -0,0 +1,11 @@ +# DB Usage Rules + +## Что описывать +- какие API / logic block / batch job используют таблицу; +- какие операции выполняются: read / insert / update / delete; +- как таблица участвует в пользовательском сценарии. + +## Правила +- ссылки на связанные документы давать по `doc_id` или path; +- не дублировать полный use case, а показывать роль таблицы в сценарии; +- если таблица используется для пагинации, фильтрации или сортировки, это нужно отметить явно. diff --git a/_process/doc_rules_v3/common-elements/details.md b/_process/doc_rules_v3/common-elements/details.md new file mode 100644 index 0000000..329f069 --- /dev/null +++ b/_process/doc_rules_v3/common-elements/details.md @@ -0,0 +1,10 @@ +# Details Rules + +## Назначение +Этот файл задает общие правила для секции `## Details`. + +## Правила +- `Details` оформляется как `## Details`. +- Внутри `Details` используются заголовки уровня `###` и ниже. +- Структура `Details` определяется template типа документа. +- В `Details` не нужно дублировать навигацию и связи, если они уже есть во frontmatter. diff --git a/_process/doc_rules_v3/common-elements/fr.md b/_process/doc_rules_v3/common-elements/fr.md new file mode 100644 index 0000000..0e3e206 --- /dev/null +++ b/_process/doc_rules_v3/common-elements/fr.md @@ -0,0 +1,31 @@ +# Functional Requirements Rules + +## Формат +- `FR.<номер>. <Название>` +- Нумерация инкрементальная внутри документа. + +## Правила +- FR расширяют шаги сценария. +- FR не копируют шаги сценария без добавления новой информации. +- Для интеграционных шагов FR обязательны. +- Если в сценарии есть вызов внешнего API / сервиса / БД, нужен отдельный FR на интеграцию. + +## FR для интеграционных шагов +Для интеграционного FR обязательно раскрывать: +- как формируется запрос; +- откуда берется каждый значимый атрибут запроса; +- какой downstream вызывается; +- какой ответ считается успешным; +- какие ответы и ситуации считаются бизнес-ошибкой; +- какие ситуации считаются технической ошибкой; +- как downstream-ответ маппится в контракт текущего слоя. + +## FR для шагов доступа к БД +Если шаг читает или пишет БД, FR должен по возможности включать: +- таблицу или набор таблиц; +- логику фильтрации; +- логику сортировки; +- логику пагинации; +- пример SQL или близкий к рабочему псевдо-SQL. + +Если СУБД и диалект не заданы, допускается сделать рабочее предположение и явно зафиксировать его. diff --git a/_process/doc_rules_v3/common-elements/nfr.md b/_process/doc_rules_v3/common-elements/nfr.md new file mode 100644 index 0000000..32ab9cd --- /dev/null +++ b/_process/doc_rules_v3/common-elements/nfr.md @@ -0,0 +1,20 @@ +# Non-Functional Requirements Rules + +## Для api_method +- Подразделы: + - `#### Аудит` (если применимо) + - `#### Мониторинг` + +## Мониторинг +Оформлять таблицей: +- `Метрика` +- `Описание` +- `Условие срабатывания` + +Запрещено: +- использовать «точка измерения = метод» вместо условий срабатывания. + +Базовые суффиксы метрик: +- `_SUCCESS` +- `_FAIL` +- `_BUSINESS_ERROR` diff --git a/_process/doc_rules_v3/common-elements/sql-example.md b/_process/doc_rules_v3/common-elements/sql-example.md new file mode 100644 index 0000000..5325f23 --- /dev/null +++ b/_process/doc_rules_v3/common-elements/sql-example.md @@ -0,0 +1,15 @@ +# SQL Example Rules + +## Назначение +Секция показывает пример рабочего SQL для основного сценария использования таблицы. + +## Правила +- SQL должен быть близок к рабочему, а не абстрактным псевдокодом; +- если диалект БД не указан, допускается выбрать наиболее вероятный вариант и явно зафиксировать допущение; +- пример должен отражать реальный сценарий документа: чтение, вставка, обновление или агрегация; +- для read-сценариев по возможности показывать фильтрацию, сортировку и пагинацию; +- если есть join, нужно кратко пояснить, зачем он нужен. + +## Формат +- fenced code block с указанием `sql`; +- под кодом 1-3 поясняющих bullets о ключевых условиях, индексах и параметрах. diff --git a/_process/doc_rules_v3/common-elements/summary.md b/_process/doc_rules_v3/common-elements/summary.md new file mode 100644 index 0000000..a70a141 --- /dev/null +++ b/_process/doc_rules_v3/common-elements/summary.md @@ -0,0 +1,10 @@ +# Summary Rules + +## Назначение +Этот файл задает правила для секции `## Summary`. + +## Правила +- `Summary` должен быть коротким слоем быстрого контекста. +- `Summary` должен объяснять суть документа без длинных деталей. +- Предпочтительный формат: краткий список ключевых фактов. +- `Summary` не должен дублировать `Details`. diff --git a/_process/doc_rules_v3/common-elements/tech-use-case.md b/_process/doc_rules_v3/common-elements/tech-use-case.md new file mode 100644 index 0000000..9ae3b64 --- /dev/null +++ b/_process/doc_rules_v3/common-elements/tech-use-case.md @@ -0,0 +1,16 @@ +# Tech Use Case Rules + +## Обязательные части +- название +- предусловия +- триггер +- основной сценарий +- альтернативный сценарий +- обработка ошибок +- постусловие + +## Правила шага +- Один шаг = одно предложение до 15-20 слов. +- Формат шага: смысловое действие + техническая реализация (endpoint/топик/операция). +- Длинные технические детали выносить в FR и ссылаться на FR из шага. +- Для интеграционных шагов описание обработки ошибок обязательно. diff --git a/_process/doc_rules_v3/common-elements/ui-requirements.md b/_process/doc_rules_v3/common-elements/ui-requirements.md new file mode 100644 index 0000000..0de6134 --- /dev/null +++ b/_process/doc_rules_v3/common-elements/ui-requirements.md @@ -0,0 +1,22 @@ +# UI Requirements Rules + +## Структура блока +- `### Требования к UI` +- Внутри обязательно отдельные формы: + - табличное представление + - пустой список (empty state) + - ошибка (error state) + +## Обязательные правила +- Если есть интеграция, обязательно описывать показ ошибки. +- Если есть список, обязательно описывать показ отсутствия данных. + +## Описание UI-элементов +UI-элементы описываются строго в таблице. + +Обязательные колонки (где применимо): +- `Код элемента` +- `Название и описание` +- `Данные` +- `Поведение` +- `Валидация` diff --git a/_process/doc_rules_v3/common-elements/user-analytics.md b/_process/doc_rules_v3/common-elements/user-analytics.md new file mode 100644 index 0000000..f9fee1e --- /dev/null +++ b/_process/doc_rules_v3/common-elements/user-analytics.md @@ -0,0 +1,7 @@ +# User Analytics Rules + +События пользовательской аналитики оформлять таблицей: +- `Название события` +- `Описание` +- `Точка вызова` +- `Payload` diff --git a/_process/doc_rules_v3/documentation-rules.md b/_process/doc_rules_v3/documentation-rules.md new file mode 100644 index 0000000..9d0b6d9 --- /dev/null +++ b/_process/doc_rules_v3/documentation-rules.md @@ -0,0 +1,45 @@ +# Documentation Rules V3 + +## 1. Общий контракт +- Документация строится на основе системной аналитики, но на более детальном уровне. +- Заголовки отражают только суть раздела; метаданные в заголовках запрещены. +- Метаданные указываются во frontmatter и/или отдельными строками в body. +- Структура документа определяется только template соответствующего типа. +- Правила написания конкретного раздела определяются только соответствующим `common-elements` файлом. +- Manifest типа документа хранится во frontmatter соответствующего template. + +## 2. Источники требований +При генерации документа учитывать: +- `/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/_process/04. Analitycs artefacts - documentation.md` +- `/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/_process/04. Analitycs artefacts - features.md` +- правила v2 из `src/app/core/agent/processes/v2/doc_rules_v2` + +## 3. Разрыв аналитика vs документация +- Аналитика: концептуальная, укрупненная. +- Документация: технически детальная. +- Технический use case в документации не копирует аналитический 1-в-1, а детализирует его. +- Функциональные требования расширяют сценарий и не дублируют шаги без новой информации. + +## 4. Заполнение пробелов +Если атрибуты/детали отсутствуют в аналитике: +1. восстановить из формулировок аналитики; +2. уточнить по репозиторию (код, контракты, существующие документы); +3. зафиксировать в документации явно. + +## 5. Сборка итогового промпта +1. Загрузить global-правила. +2. Загрузить template типа документа. +3. Прочитать YAML frontmatter template как manifest. +4. Загрузить общие блоки, указанные в manifest. +5. Применить body template как единственный источник структуры. +5. Проверить чек-лист совместимости с аналитикой (domain/sub_domain, роли слоев, интеграции, ошибки). + +## 6. Формат manifest типа документа +Manifest типа документа хранится во frontmatter `templates/.template.md`. + +Минимальная схема: +- `doc_type` +- `required_common_elements` + +Дополнительно можно указывать: +- `special_rules` diff --git a/_process/doc_rules_v3/global/analytics-to-doc.md b/_process/doc_rules_v3/global/analytics-to-doc.md new file mode 100644 index 0000000..d495ace --- /dev/null +++ b/_process/doc_rules_v3/global/analytics-to-doc.md @@ -0,0 +1,10 @@ +# Analytics to Documentation Mapping + +## Принцип +- Системная аналитика задает «что». +- Документация детализирует «как». + +## Маппинг +- Из раздела архитектуры аналитики переносить контейнеры, интеграции и цепочки вызовов. +- Из раздела изменений аналитики строить отдельные технические страницы (`ui_page`, `api_method`, `logic_block`). +- Если в аналитике упрощенный use case, в документации раскрывать полный технический сценарий по правилам `tech-use-case.md`. diff --git a/_process/doc_rules_v3/global/filepaths.md b/_process/doc_rules_v3/global/filepaths.md new file mode 100644 index 0000000..f90d43f --- /dev/null +++ b/_process/doc_rules_v3/global/filepaths.md @@ -0,0 +1,67 @@ +# Правила определения путей файлов + +Текущая happy-path реализация строит путь документа по фиксированному шаблону: + +`docs////.md` + +Пример: + +`docs/orders/pprb/ui_page/orders.ui.list.md` + +## Источники атрибутов + +Для построения пути используются четыре основных атрибута: + +- `domain` +- `application` +- `platform` +- `doc_type` +- `id` как `doc_id` + +Если атрибуты явно указаны в подразделе `6.x`, нужно использовать их. +Если атрибут не указан, он может быть взят из общих метаданных аналитики или определен fallback-логикой. + +## Нормализация сегментов + +Каждый сегмент пути нормализуется одинаково: + +- значение переводится в lowercase; +- все символы, кроме `a-z`, `0-9`, `.`, `_`, `-`, заменяются на `-`; +- ведущие и хвостовые `.` и `-` удаляются. + +Примеры нормализации: + +- `Payment Status` -> `payment-status` +- `UFS Orders` -> `ufs-orders` +- `crm.mobile` -> `crm.mobile` + +## Значения по умолчанию + +Если после нормализации сегмент пустой, используются fallback-значения: + +- корневая папка: `domain`, иначе `application`, иначе `common` +- `platform` -> `web` +- `doc_type` -> `misc` +- `doc_id` -> `untitled` + +## Что важно в текущей версии + +- для корневой папки сначала используется `domain`; +- если `domain` не задан, используется `application`; +- `sub_domain` сейчас не участвует в построении пути; +- операции `create`, `update`, `delete` работают с одним и тем же правилом вычисления пути; +- специальных исключений для разных типов документов пока нет; +- отдельные каталоги для `pprb`, `ufs`, `web` задаются только через значение `platform`. + +## Практическое правило для агента + +Если нужно предложить или определить путь новой страницы, агент должен: + +1. определить `application`; +2. определить `domain`; +3. определить `platform`; +4. определить `doc_type`; +5. определить стабильный `doc_id`; +6. взять корневую папку как `domain`, а если он пустой, то `application`; +7. нормализовать все сегменты; +8. собрать путь по шаблону `docs////.md`. diff --git a/_process/doc_rules_v3/global/frontmatter.md b/_process/doc_rules_v3/global/frontmatter.md new file mode 100644 index 0000000..b0e94e1 --- /dev/null +++ b/_process/doc_rules_v3/global/frontmatter.md @@ -0,0 +1,32 @@ +# Frontmatter Rules + +## Обязательные поля +```yaml +id: string +title: string +doc_type: string +domain: string +sub_domain: string +related_docs: [] +status: string +``` + +## Рекомендуемые поля +```yaml +tags: [] +entities: [] +source_of_truth: string +related_code: [] +system_analytics_refs: [] +``` + +## Body-метаданные для секции изменений +Под корнем секции изменений указывать: +- `domain` +- `sub_domain` + +Для каждого подраздела `X.Y` указывать строками: +- `id` +- `doc_type` +- `application` +- `platform` diff --git a/_process/doc_rules_v3/global/header-rules.md b/_process/doc_rules_v3/global/header-rules.md new file mode 100644 index 0000000..1c6e075 --- /dev/null +++ b/_process/doc_rules_v3/global/header-rules.md @@ -0,0 +1,10 @@ +# Header Rules + +## Правила +- Заголовок описывает только смысл раздела. +- Не включать в заголовок: `id`, `doc_type`, `application`, `platform`, `domain`, `sub_domain`. +- Метаданные указываются отдельными строками ниже заголовка или во frontmatter. + +## Пример +- Правильно: `## 6.2 Метод UFS получения списка заказов` +- Неправильно: `## 6.2 Блок api_method (id=..., platform=ufs)` diff --git a/_process/doc_rules_v3/global/layer-responsibility.md b/_process/doc_rules_v3/global/layer-responsibility.md new file mode 100644 index 0000000..cb09845 --- /dev/null +++ b/_process/doc_rules_v3/global/layer-responsibility.md @@ -0,0 +1,10 @@ +# Layer Responsibility + +- `ui`: отображение, UX, запуск пользовательских сценариев. +- `ufs`: авторизация/аутентификация, агрегация, маппинг, оркестрация вызовов. +- `pprb`: API, БД, доменная логика backend. + +## Правила согласованности +- Проверка ролевой модели пользователя обычно фиксируется на уровне `ufs`. +- Если проверка роли вынесена в `ufs`, в `pprb`-сценарии не дублировать этот шаг. +- Аудит для `pprb` может отсутствовать, если это явно принято для домена/фичи. diff --git a/_process/doc_rules_v3/templates/api_method.template.md b/_process/doc_rules_v3/templates/api_method.template.md new file mode 100644 index 0000000..fb79085 --- /dev/null +++ b/_process/doc_rules_v3/templates/api_method.template.md @@ -0,0 +1,34 @@ +--- +doc_type: api_method +required_common_elements: + - common-elements/summary.md + - common-elements/details.md + - common-elements/tech-use-case.md + - common-elements/fr.md + - common-elements/nfr.md + - common-elements/api-contract.md +special_rules: + - Технический use case детализируется по `common-elements/tech-use-case.md`. + - FR расширяют use case и не дублируют шаги сценария без новой информации. + - Для интеграционных шагов FR обязательны. +--- + +# + +## Summary +Правила оформления: `../common-elements/summary.md` + +## Details +Правила оформления: `../common-elements/details.md` + +### Технический use case +Правила оформления: `../common-elements/tech-use-case.md` + +### Функциональные требования +Правила оформления: `../common-elements/fr.md` + +### Нефункциональные требования +Правила оформления: `../common-elements/nfr.md` + +### Контракт +Правила оформления: `../common-elements/api-contract.md` diff --git a/_process/doc_rules_v3/templates/db_table.template.md b/_process/doc_rules_v3/templates/db_table.template.md new file mode 100644 index 0000000..ce72352 --- /dev/null +++ b/_process/doc_rules_v3/templates/db_table.template.md @@ -0,0 +1,38 @@ +--- +doc_type: db_table +required_common_elements: + - common-elements/summary.md + - common-elements/details.md + - common-elements/db-purpose.md + - common-elements/db-columns.md + - common-elements/db-constraints.md + - common-elements/db-usage.md + - common-elements/sql-example.md +special_rules: + - Документ описывает одну физическую таблицу БД или materialized view. + - Нужно фиксировать назначение таблицы, поля, ограничения, индексы, связи и сценарии использования. + - Если точные детали БД не заданы, допустимо сделать рабочие инженерные допущения и явно записать их в документ. +--- + +# <title> + +## Summary +Правила оформления: `../common-elements/summary.md` + +## Details +Правила оформления: `../common-elements/details.md` + +### Назначение таблицы +Правила оформления: `../common-elements/db-purpose.md` + +### Структура таблицы +Правила оформления: `../common-elements/db-columns.md` + +### Ограничения и индексы +Правила оформления: `../common-elements/db-constraints.md` + +### Использование в сценариях +Правила оформления: `../common-elements/db-usage.md` + +### Пример SQL +Правила оформления: `../common-elements/sql-example.md` diff --git a/_process/doc_rules_v3/templates/logic_block.template.md b/_process/doc_rules_v3/templates/logic_block.template.md new file mode 100644 index 0000000..99b03d9 --- /dev/null +++ b/_process/doc_rules_v3/templates/logic_block.template.md @@ -0,0 +1,28 @@ +--- +doc_type: logic_block +required_common_elements: + - common-elements/summary.md + - common-elements/details.md + - common-elements/tech-use-case.md + - common-elements/fr.md + - common-elements/nfr.md +special_rules: + - Logic block описывает переиспользуемую логику без дублирования UI/API деталей. +--- + +# <title> + +## Summary +Правила оформления: `../common-elements/summary.md` + +## Details +Правила оформления: `../common-elements/details.md` + +### Технический use case +Правила оформления: `../common-elements/tech-use-case.md` + +### Функциональные требования +Правила оформления: `../common-elements/fr.md` + +### Нефункциональные требования +Правила оформления: `../common-elements/nfr.md` diff --git a/_process/doc_rules_v3/templates/ui_page.template.md b/_process/doc_rules_v3/templates/ui_page.template.md new file mode 100644 index 0000000..fb1daf5 --- /dev/null +++ b/_process/doc_rules_v3/templates/ui_page.template.md @@ -0,0 +1,33 @@ +--- +doc_type: ui_page +required_common_elements: + - common-elements/summary.md + - common-elements/details.md + - common-elements/tech-use-case.md + - common-elements/ui-requirements.md + - common-elements/fr.md + - common-elements/user-analytics.md +special_rules: + - Для списочных страниц обязательно описывать табличное представление, empty state и error state. + - UI-элементы описываются в таблицах по правилам `common-elements/ui-requirements.md`. +--- + +# <title> + +## Summary +Правила оформления: `../common-elements/summary.md` + +## Details +Правила оформления: `../common-elements/details.md` + +### Технический use case +Правила оформления: `../common-elements/tech-use-case.md` + +### Требования к UI +Правила оформления: `../common-elements/ui-requirements.md` + +### Функциональные требования +Правила оформления: `../common-elements/fr.md` + +### Нефункциональные требования +Правила оформления: `../common-elements/user-analytics.md` diff --git a/runtime_traces/agent_requests/20260408-095601-28fa24cfdd8f.md b/runtime_traces/agent_requests/20260408-095601-28fa24cfdd8f.md deleted file mode 100644 index 218d84a..0000000 --- a/runtime_traces/agent_requests/20260408-095601-28fa24cfdd8f.md +++ /dev/null @@ -1,1011 +0,0 @@ -# Runtime Trace: 20260408-095601-28fa24cfdd8f - -- active_rag_session_id: d12ebfeb-de86-4f32-b5f2-28fa24cfdd8f - -## request -```json -{ - "request_id": "req_058c0fc6d5a847c0bbf1a39dad9544a9", - "session_id": "as_4d32d24ffdac4882bf2d1d44f506aeb5", - "active_rag_session_id": "d12ebfeb-de86-4f32-b5f2-28fa24cfdd8f", - "process_version": "v2", - "created_at": "2026-04-08T09:56:01.194308+00:00", - "message": "Какие эндпоинты относятся к health?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие эндпоинты относятся к health?", - "target_terms": [ - "health" - ], - "anchors": { - "entity_names": [ - "health" - ], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [ - "health", - "healthpayload", - "healthpayload" - ], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.7500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается поиска эндпоинтов, связанных с health.", - "rag_session_id": "d12ebfeb-de86-4f32-b5f2-28fa24cfdd8f" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.7500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [ - "health" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%health%" - ], - "query_signals": [ - "health" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%health%" - ], - "query_signals": [ - "health" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 1 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 1, - "endpoints": [ - "GET /health" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 1 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 1 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 11 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 1 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 1 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 11 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 11 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /health", - "completed_at": "2026-04-08T09:56:05.261129+00:00" -} -``` - -## request -```json -{ - "request_id": "req_56fad4e1aa3b441fbef9a96598d6ffb0", - "session_id": "as_4d32d24ffdac4882bf2d1d44f506aeb5", - "active_rag_session_id": "d12ebfeb-de86-4f32-b5f2-28fa24cfdd8f", - "process_version": "v2", - "created_at": "2026-04-08T09:56:08.855154+00:00", - "message": "Какие эндпоинты есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие эндпоинты есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается поиска эндпоинтов проекта.", - "rag_session_id": "d12ebfeb-de86-4f32-b5f2-28fa24cfdd8f" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 3 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 3, - "endpoints": [ - "GET /actions/{action}", - "GET /health", - "GET /send" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 3 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 3 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 43 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 3 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 3 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 43 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 43 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /actions/{action}\nGET /health\nGET /send", - "completed_at": "2026-04-08T09:56:11.883300+00:00" -} -``` - -## request -```json -{ - "request_id": "req_9beeef216856436ba05b31b04595ec75", - "session_id": "as_4d32d24ffdac4882bf2d1d44f506aeb5", - "active_rag_session_id": "d12ebfeb-de86-4f32-b5f2-28fa24cfdd8f", - "process_version": "v2", - "created_at": "2026-04-08T09:57:24.211542+00:00", - "message": "Какие эндпоинты есть в notifications" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие эндпоинты есть в notifications", - "target_terms": [ - "notifications" - ], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": "notifications", - "process_subdomain": null, - "scope_type": "domain", - "candidate_domains": [ - "notifications" - ], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается поиска эндпоинтов в конкретной области 'notifications'.", - "rag_session_id": "d12ebfeb-de86-4f32-b5f2-28fa24cfdd8f" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [ - "notifications" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%notifications%" - ], - "query_signals": [ - "notifications" - ], - "metadata.domain": "notifications" - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%notifications%" - ], - "query_signals": [ - "notifications" - ], - "metadata.domain": "notifications" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 3 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 3, - "endpoints": [ - "GET /actions/{action}", - "GET /health", - "GET /send" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 3 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 3 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 43 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 3 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 3 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 43 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 43 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /actions/{action}\nGET /health\nGET /send", - "completed_at": "2026-04-08T09:57:27.891584+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260408-130754-c008300db553.md b/runtime_traces/agent_requests/20260408-130754-c008300db553.md deleted file mode 100644 index 3d8ff51..0000000 --- a/runtime_traces/agent_requests/20260408-130754-c008300db553.md +++ /dev/null @@ -1,103 +0,0 @@ -# Runtime Trace: 20260408-130754-c008300db553 - -- active_rag_session_id: 273bb6f2-0921-412a-9c73-c008300db553 - -## request -```json -{ - "request_id": "req_e2b3901d8fcd4b2f88ba2fd5e09e4073", - "session_id": "as_da9ab26d0dbe4ee2b6a2b392ff1ebdc9", - "active_rag_session_id": "273bb6f2-0921-412a-9c73-c008300db553", - "process_version": "v2", - "created_at": "2026-04-08T13:07:54.329187+00:00", - "message": "Напиши документацию по системной аналитике \n/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FIND_FILES", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY", - "FIND_FILES" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по системной аналитике из конкретного файла feature1.md.", - "rag_session_id": "273bb6f2-0921-412a-9c73-c008300db553" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FIND_FILES", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY", - "FIND_FILES" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## result -```json -{ - "status": "error", - "error": { - "code": "api_runtime_error", - "desc": "Agent request failed unexpectedly.", - "module": "agent" - }, - "completed_at": "2026-04-08T13:07:57.414809+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260408-130830-d398ef674b67.md b/runtime_traces/agent_requests/20260408-130830-d398ef674b67.md deleted file mode 100644 index 438f21c..0000000 --- a/runtime_traces/agent_requests/20260408-130830-d398ef674b67.md +++ /dev/null @@ -1,103 +0,0 @@ -# Runtime Trace: 20260408-130830-d398ef674b67 - -- active_rag_session_id: b0fed7d3-965b-4103-91b5-d398ef674b67 - -## request -```json -{ - "request_id": "req_9ee1b7dae1cb4f8dbc81537e678734b8", - "session_id": "as_c1e2c54c04c4483da7f956fb94fedd3e", - "active_rag_session_id": "b0fed7d3-965b-4103-91b5-d398ef674b67", - "process_version": "v2", - "created_at": "2026-04-08T13:08:30.296355+00:00", - "message": "Напиши документацию по системной аналитике \n/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FIND_FILES", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY", - "FIND_FILES" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по системной аналитике из указанного файла feature1.md.", - "rag_session_id": "b0fed7d3-965b-4103-91b5-d398ef674b67" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FIND_FILES", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY", - "FIND_FILES" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## result -```json -{ - "status": "error", - "error": { - "code": "api_runtime_error", - "desc": "Agent request failed unexpectedly.", - "module": "agent" - }, - "completed_at": "2026-04-08T13:08:32.914987+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260408-131217-d6aef7712b50.md b/runtime_traces/agent_requests/20260408-131217-d6aef7712b50.md deleted file mode 100644 index 9c9c168..0000000 --- a/runtime_traces/agent_requests/20260408-131217-d6aef7712b50.md +++ /dev/null @@ -1,303 +0,0 @@ -# Runtime Trace: 20260408-131217-d6aef7712b50 - -- active_rag_session_id: 09fb3332-3623-4164-9bb4-d6aef7712b50 - -## request -```json -{ - "request_id": "req_44b293c2d2d34247a4ad4ffbf6e529f9", - "session_id": "as_c3998b60e2814f7090ead25d83aa990e", - "active_rag_session_id": "09fb3332-3623-4164-9bb4-d6aef7712b50", - "process_version": "v2", - "created_at": "2026-04-08T13:12:17.468690+00:00", - "message": "Напиши документацию по системной аналитике \n/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по указанному файлу feature1.md.", - "rag_session_id": "09fb3332-3623-4164-9bb4-d6aef7712b50" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": {}, - "output": { - "changeset_items": 1, - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": {}, - "output": { - "answer_length": 801, - "issues": 0, - "changeset_items": 1 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "issues": 0 - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 0 - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 0 - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": {}, - "output": { - "changeset_items": 1, - "issues": 0 - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": {}, - "output": { - "answer_length": 801, - "issues": 0, - "changeset_items": 1 - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 801, - "changeset_items": 1 -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nПлан изменений:\n- create: docs/api/api-telegram-messages-get.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntitle: Реализация эндпоинта `GET /telegram/messages`\\ndoc_type: api_method\\ndomain: unknown\\nsub_domain: unknown\\nstatus: generated\\nrelated_docs:\\n - TBD\\nsource_of_truth: system_analysis\\nsystem_analytics_refs:\\n - section: 5. Функциональные требования\\n---\\n\\n## Summary\\n\\nЧерновик сгенерирован workflow DOC_UPDATE/FROM_FEATURE.\\n\",\n \"reason\": \"Из unit 'Реализация эндпоинта `GET /telegram/messages`' системной аналитики (analysis).\",\n \"hunks\": []\n }\n]\n```", - "completed_at": "2026-04-08T13:12:20.251846+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260408-133710-3fcdfdcab8be.md b/runtime_traces/agent_requests/20260408-133710-3fcdfdcab8be.md deleted file mode 100644 index 3c776dc..0000000 --- a/runtime_traces/agent_requests/20260408-133710-3fcdfdcab8be.md +++ /dev/null @@ -1,303 +0,0 @@ -# Runtime Trace: 20260408-133710-3fcdfdcab8be - -- active_rag_session_id: a603ea81-9785-4846-8c05-3fcdfdcab8be - -## request -```json -{ - "request_id": "req_c5a90cbf219046cc91239e4fae39ac3e", - "session_id": "as_5bad25c4dd394e33884ff7471bbcbf4a", - "active_rag_session_id": "a603ea81-9785-4846-8c05-3fcdfdcab8be", - "process_version": "v2", - "created_at": "2026-04-08T13:37:10.869126+00:00", - "message": "Напиши документацию по системной аналитике \n/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по указанному файлу feature1.md.", - "rag_session_id": "a603ea81-9785-4846-8c05-3fcdfdcab8be" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": {}, - "output": { - "changeset_items": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": {}, - "output": { - "answer_length": 2340, - "issues": 3, - "changeset_items": 1 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "issues": 0 - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3 - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3 - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": {}, - "output": { - "changeset_items": 1, - "issues": 3 - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": {}, - "output": { - "answer_length": 2340, - "issues": 3, - "changeset_items": 1 - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 2340, - "changeset_items": 1 -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует analysis_id в metadata аналитики.\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n\nПлан изменений:\n- create: docs/api/api-telegram-messages-get.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntitle: Реализация эндпоинта `GET /telegram/messages`\\ndoc_type: api_method\\ndomain: unknown\\nsub_domain: unknown\\nstatus: generated\\nrelated_docs:\\n - TBD\\nsource_of_truth: system_analysis\\nsystem_analytics_refs:\\n - section: 5. Функциональные требования\\n---\\n\\n## Context\\n\\nЧерновик сгенерирован workflow DOC_UPDATE/FROM_FEATURE на основе системной аналитики.\\n\\n## Functional Requirements\\n\\nСценарий описывает поведение endpoint и включает все обязательные функциональные требования.\\n\\n1. Потребитель вызывает endpoint `GET /telegram/messages` и передает параметр `secret`.\\n2. Сервис сравнивает переданный `secret` со значением `APP_ENDPOINT_SECRET` из защищенной конфигурации.\\n3. Если `secret` не совпадает:\\n\\n- сервис возвращает отказ в доступе (`403 Forbidden`);\\n- обработка завершается;\\n- вызов в Telegram API не выполняется.\\n\\n1. Если `secret` совпадает, сервис выполняет вызов Telegram Bot API:\\n\\n- Метод: `getUpdates`;\\n- HTTP: `POST https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/getUpdates`;\\n- Допустимые параметры запроса (по необходимости): `offset`, `limit`, `timeout`, `allowed_updates`.\\n\\n1. Сервис получает список update, выделяет непрочитанные (необработанные) сообщения и формирует доменный результат.\\n2. Сервис возвращает клиенту ответ в формате `AppResponseDto` (статус выполнения + полезная нагрузка).\\n3. Если Telegram API возвращает ошибку/некорректный ответ, сервис возвращает контролируемую ошибку без утечки внутренних данных интеграции.\\n\\nНеобходимые секреты для реализации сценария:\\n\\n- `APP_ENDPOINT_SECRET` - секрет для авторизации входящего запроса к endpoint;\\n- `TELEGRAM_BOT_TOKEN` - токен Telegram-бота для вызова метода `getUpdates`.\\n\",\n \"reason\": \"Из unit 'Реализация эндпоинта `GET /telegram/messages`' системной аналитики (analysis).\",\n \"hunks\": []\n }\n]\n```", - "completed_at": "2026-04-08T13:37:13.627111+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260408-134243-ae814cadec74.md b/runtime_traces/agent_requests/20260408-134243-ae814cadec74.md deleted file mode 100644 index 7f65a5d..0000000 --- a/runtime_traces/agent_requests/20260408-134243-ae814cadec74.md +++ /dev/null @@ -1,305 +0,0 @@ -# Runtime Trace: 20260408-134243-ae814cadec74 - -- active_rag_session_id: 07b0a164-32cd-47cc-ba4d-ae814cadec74 - -## request -```json -{ - "request_id": "req_a1f51efe7fe540a393f2840f830f0710", - "session_id": "as_968bcb99e71d454eb0b38cbe5021ac32", - "active_rag_session_id": "07b0a164-32cd-47cc-ba4d-ae814cadec74", - "process_version": "v2", - "created_at": "2026-04-08T13:42:43.644632+00:00", - "message": "Напиши документацию по системной аналитике\n/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по системной аналитике из указанного файла feature1.md.", - "rag_session_id": "07b0a164-32cd-47cc-ba4d-ae814cadec74" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": {}, - "output": { - "changeset_items": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": {}, - "output": { - "answer_length": 2340, - "issues": 3, - "changeset_items": 1 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0 - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3 - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3 - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": {}, - "output": { - "changeset_items": 1, - "issues": 3 - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": {}, - "output": { - "answer_length": 2340, - "issues": 3, - "changeset_items": 1 - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 2340, - "changeset_items": 1 -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует analysis_id в metadata аналитики.\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n\nПлан изменений:\n- create: docs/api/api-telegram-messages-get.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntitle: Реализация эндпоинта `GET /telegram/messages`\\ndoc_type: api_method\\ndomain: unknown\\nsub_domain: unknown\\nstatus: generated\\nrelated_docs:\\n - TBD\\nsource_of_truth: system_analysis\\nsystem_analytics_refs:\\n - section: 5. Функциональные требования\\n---\\n\\n## Context\\n\\nЧерновик сгенерирован workflow DOC_UPDATE/FROM_FEATURE на основе системной аналитики.\\n\\n## Functional Requirements\\n\\nСценарий описывает поведение endpoint и включает все обязательные функциональные требования.\\n\\n1. Потребитель вызывает endpoint `GET /telegram/messages` и передает параметр `secret`.\\n2. Сервис сравнивает переданный `secret` со значением `APP_ENDPOINT_SECRET` из защищенной конфигурации.\\n3. Если `secret` не совпадает:\\n\\n- сервис возвращает отказ в доступе (`403 Forbidden`);\\n- обработка завершается;\\n- вызов в Telegram API не выполняется.\\n\\n1. Если `secret` совпадает, сервис выполняет вызов Telegram Bot API:\\n\\n- Метод: `getUpdates`;\\n- HTTP: `POST https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/getUpdates`;\\n- Допустимые параметры запроса (по необходимости): `offset`, `limit`, `timeout`, `allowed_updates`.\\n\\n1. Сервис получает список update, выделяет непрочитанные (необработанные) сообщения и формирует доменный результат.\\n2. Сервис возвращает клиенту ответ в формате `AppResponseDto` (статус выполнения + полезная нагрузка).\\n3. Если Telegram API возвращает ошибку/некорректный ответ, сервис возвращает контролируемую ошибку без утечки внутренних данных интеграции.\\n\\nНеобходимые секреты для реализации сценария:\\n\\n- `APP_ENDPOINT_SECRET` - секрет для авторизации входящего запроса к endpoint;\\n- `TELEGRAM_BOT_TOKEN` - токен Telegram-бота для вызова метода `getUpdates`.\\n\",\n \"reason\": \"Из unit 'Реализация эндпоинта `GET /telegram/messages`' системной аналитики (analysis).\",\n \"hunks\": []\n }\n]\n```", - "completed_at": "2026-04-08T13:42:47.600078+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260408-135621-3d42c447c174.md b/runtime_traces/agent_requests/20260408-135621-3d42c447c174.md deleted file mode 100644 index 7c39752..0000000 --- a/runtime_traces/agent_requests/20260408-135621-3d42c447c174.md +++ /dev/null @@ -1,306 +0,0 @@ -# Runtime Trace: 20260408-135621-3d42c447c174 - -- active_rag_session_id: 7bc8440f-382f-4df3-9a82-3d42c447c174 - -## request -```json -{ - "request_id": "req_5bd727fe052841efbbd9f69651e57bca", - "session_id": "as_8d0e3b766f3a49b495e3074a3bcfe777", - "active_rag_session_id": "7bc8440f-382f-4df3-9a82-3d42c447c174", - "process_version": "v2", - "created_at": "2026-04-08T13:56:21.477390+00:00", - "message": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по системной аналитике из указанного файла feature1.md.", - "rag_session_id": "7bc8440f-382f-4df3-9a82-3d42c447c174" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": {}, - "output": { - "changeset_items": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": {}, - "output": { - "answer_length": 2364, - "issues": 3, - "changeset_items": 1 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0 - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3 - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3 - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": {}, - "output": { - "changeset_items": 1, - "issues": 3 - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": {}, - "output": { - "answer_length": 2364, - "issues": 3, - "changeset_items": 1 - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 2364, - "changeset_items": 1, - "apply_changeset": false -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует analysis_id в metadata аналитики.\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n\nПлан изменений:\n- create: docs/api/api-telegram-messages-get.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntitle: Реализация эндпоинта `GET /telegram/messages`\\ndoc_type: api_method\\ndomain: unknown\\nsub_domain: unknown\\nstatus: generated\\nrelated_docs:\\n - TBD\\nsource_of_truth: system_analysis\\nsystem_analytics_refs:\\n - section: 5. Функциональные требования\\n---\\n\\n## Context\\n\\nЧерновик сгенерирован workflow DOC_UPDATE/FROM_FEATURE на основе системной аналитики.\\n\\n## Functional Requirements\\n\\nСценарий описывает поведение endpoint и включает все обязательные функциональные требования.\\n\\n1. Потребитель вызывает endpoint `GET /telegram/messages` и передает параметр `secret`.\\n2. Сервис сравнивает переданный `secret` со значением `APP_ENDPOINT_SECRET` из защищенной конфигурации.\\n3. Если `secret` не совпадает:\\n\\n- сервис возвращает отказ в доступе (`403 Forbidden`);\\n- обработка завершается;\\n- вызов в Telegram API не выполняется.\\n\\n1. Если `secret` совпадает, сервис выполняет вызов Telegram Bot API:\\n\\n- Метод: `getUpdates`;\\n- HTTP: `POST https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/getUpdates`;\\n- Допустимые параметры запроса (по необходимости): `offset`, `limit`, `timeout`, `allowed_updates`.\\n\\n1. Сервис получает список update, выделяет непрочитанные (необработанные) сообщения и формирует доменный результат.\\n2. Сервис возвращает клиенту ответ в формате `AppResponseDto` (статус выполнения + полезная нагрузка).\\n3. Если Telegram API возвращает ошибку/некорректный ответ, сервис возвращает контролируемую ошибку без утечки внутренних данных интеграции.\\n\\nНеобходимые секреты для реализации сценария:\\n\\n- `APP_ENDPOINT_SECRET` - секрет для авторизации входящего запроса к endpoint;\\n- `TELEGRAM_BOT_TOKEN` - токен Telegram-бота для вызова метода `getUpdates`.\\n\",\n \"reason\": \"Из unit 'Реализация эндпоинта `GET /telegram/messages`' системной аналитики (analysis).\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: false", - "completed_at": "2026-04-08T13:56:24.354339+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260408-135847-14bbe60d0cc3.md b/runtime_traces/agent_requests/20260408-135847-14bbe60d0cc3.md deleted file mode 100644 index 1aca920..0000000 --- a/runtime_traces/agent_requests/20260408-135847-14bbe60d0cc3.md +++ /dev/null @@ -1,306 +0,0 @@ -# Runtime Trace: 20260408-135847-14bbe60d0cc3 - -- active_rag_session_id: 3be9766d-2a4d-4fa6-9d86-14bbe60d0cc3 - -## request -```json -{ - "request_id": "req_6662d31380114d628963f48516560a7e", - "session_id": "as_6df21081790f4954b93cc47f6f418554", - "active_rag_session_id": "3be9766d-2a4d-4fa6-9d86-14bbe60d0cc3", - "process_version": "v2", - "created_at": "2026-04-08T13:58:47.981631+00:00", - "message": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по указанному файлу feature1.md.", - "rag_session_id": "3be9766d-2a4d-4fa6-9d86-14bbe60d0cc3" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": {}, - "output": { - "changeset_items": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": {}, - "output": { - "answer_length": 2363, - "issues": 3, - "changeset_items": 1 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0 - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3 - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3 - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": {}, - "output": { - "changeset_items": 1, - "issues": 3 - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": {}, - "output": { - "answer_length": 2363, - "issues": 3, - "changeset_items": 1 - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 2363, - "changeset_items": 1, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует analysis_id в metadata аналитики.\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n\nПлан изменений:\n- create: docs/api/api-telegram-messages-get.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntitle: Реализация эндпоинта `GET /telegram/messages`\\ndoc_type: api_method\\ndomain: unknown\\nsub_domain: unknown\\nstatus: generated\\nrelated_docs:\\n - TBD\\nsource_of_truth: system_analysis\\nsystem_analytics_refs:\\n - section: 5. Функциональные требования\\n---\\n\\n## Context\\n\\nЧерновик сгенерирован workflow DOC_UPDATE/FROM_FEATURE на основе системной аналитики.\\n\\n## Functional Requirements\\n\\nСценарий описывает поведение endpoint и включает все обязательные функциональные требования.\\n\\n1. Потребитель вызывает endpoint `GET /telegram/messages` и передает параметр `secret`.\\n2. Сервис сравнивает переданный `secret` со значением `APP_ENDPOINT_SECRET` из защищенной конфигурации.\\n3. Если `secret` не совпадает:\\n\\n- сервис возвращает отказ в доступе (`403 Forbidden`);\\n- обработка завершается;\\n- вызов в Telegram API не выполняется.\\n\\n1. Если `secret` совпадает, сервис выполняет вызов Telegram Bot API:\\n\\n- Метод: `getUpdates`;\\n- HTTP: `POST https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/getUpdates`;\\n- Допустимые параметры запроса (по необходимости): `offset`, `limit`, `timeout`, `allowed_updates`.\\n\\n1. Сервис получает список update, выделяет непрочитанные (необработанные) сообщения и формирует доменный результат.\\n2. Сервис возвращает клиенту ответ в формате `AppResponseDto` (статус выполнения + полезная нагрузка).\\n3. Если Telegram API возвращает ошибку/некорректный ответ, сервис возвращает контролируемую ошибку без утечки внутренних данных интеграции.\\n\\nНеобходимые секреты для реализации сценария:\\n\\n- `APP_ENDPOINT_SECRET` - секрет для авторизации входящего запроса к endpoint;\\n- `TELEGRAM_BOT_TOKEN` - токен Telegram-бота для вызова метода `getUpdates`.\\n\",\n \"reason\": \"Из unit 'Реализация эндпоинта `GET /telegram/messages`' системной аналитики (analysis).\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-08T13:58:52.631789+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260408-144949-393097ecb1c4.md b/runtime_traces/agent_requests/20260408-144949-393097ecb1c4.md deleted file mode 100644 index 19267b4..0000000 --- a/runtime_traces/agent_requests/20260408-144949-393097ecb1c4.md +++ /dev/null @@ -1,346 +0,0 @@ -# Runtime Trace: 20260408-144949-393097ecb1c4 - -- active_rag_session_id: c882e801-7813-41c6-8f83-393097ecb1c4 - -## request -```json -{ - "request_id": "req_e5c3cc2fcff04e60945e980dc361dae5", - "session_id": "as_1d3d0aa2d5e9425a99356dbcf74a98a8", - "active_rag_session_id": "c882e801-7813-41c6-8f83-393097ecb1c4", - "process_version": "v2", - "created_at": "2026-04-08T14:49:49.905285+00:00", - "message": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по системной аналитике из указанного файла feature1.md.", - "rag_session_id": "c882e801-7813-41c6-8f83-393097ecb1c4" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": {}, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": {}, - "output": { - "changeset_items": 1, - "issues": 3 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": {}, - "output": { - "answer_length": 6191, - "issues": 3, - "changeset_items": 1 - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0 - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": {}, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0 - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": {}, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3 - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": {}, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3 - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": {}, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3 - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": {}, - "output": { - "changeset_items": 1, - "issues": 3 - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": {}, - "output": { - "answer_length": 6191, - "issues": 3, - "changeset_items": 1 - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 6191, - "changeset_items": 1, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует analysis_id в metadata аналитики.\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n\nПлан изменений:\n- create: docs/api/api-telegram-messages-get.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntype: api_method\\ndoc_type: api_method\\nname: telegram_messages_get\\ntitle: Реализация эндпоинта `GET /telegram/messages'\\nmodule: telegram\\nlayer: application\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-05\\nsource_of_truth: analysis\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Реализация эндпоинта `GET /telegram/messages'\\n\\n## Summary\\n\\n- **Цель**: Получение списка непрочитанных сообщений из Telegram.\\n- **Актор**: Внешний клиент.\\n- **Триггер**: Вызов эндпоинта `GET /telegram/messages` с параметром `secret`.\\n- **Ошибка**: Возвращается ошибка доступа (`403 Forbidden`), если `secret` не совпадает с `APP_ENDPOINT_SECRET`.\\n- **Интеграция**: Вызов Telegram Bot API методом `getUpdates`.\\n\\n## Details\\n\\n### Описание\\n\\nЭндпоинт предназначен для получения списка непрочитанных сообщений из Telegram путем вызова метода `getUpdates` Telegram Bot API.\\n\\n### Сценарий\\n\\n**Название:** Проверка секретного ключа и получение сообщений\\n\\n**Предусловия:**\\n- Клиент имеет доступ к эндпоинту `GET /telegram/messages`.\\n- Передан параметр `secret`.\\n\\n**Триггер:**\\n- Клиент вызывает эндпоинт `GET /telegram/messages` с параметром `secret`.\\n\\n**Основной сценарий:**\\n1. Сервис проверяет совпадение переданного `secret` со значением `APP_ENDPOINT_SECRET`.\\n2. Если `secret` совпадает, сервис вызывает метод `getUpdates` Telegram Bot API.\\n3. Сервер Telegram возвращает список обновлений, которые сервис обрабатывает и фильтрует.\\n4. Сервис формирует и возвращает ответ в формате `AppResponseDto`.\\n\\n**Альтернативный сценарий:**\\n- Если `secret` не совпадает, сервис возвращает ошибку доступа (`403 Forbidden`).\\n\\n**Обработка ошибок:**\\n- При ошибке в вызове Telegram API возвращается контролируемая ошибка без утечки данных интеграции.\\n\\n**Постусловие:**\\n- Клиент получил список непрочитанных сообщений или сообщение об ошибке.\\n\\n### Функциональные требования\\n\\n**FR-1.** Эндпоинт должен принимать параметр `secret` и сравнивать его с `APP_ENDPOINT_SECRET`.\\n**FR-2.** Если `secret` совпадает, эндпоинт должен вызывать метод `getUpdates` Telegram Bot API.\\n**FR-3.** Эндпоинт должен обрабатывать и фильтровать полученные обновления, выделяя непрочитанные сообщения.\\n**FR-4.** Эндпоинт должен возвращать ответ в формате `AppResponseDto`.\\n**FR-5.** Эндпоинт должен контролировать ошибки при взаимодействии с Telegram API.\\n\\n### Нефункциональные требования\\n\\n**NFR-1.** Эндпоинт должен обеспечивать безопасность данных, предотвращая утечку информации интеграции.\\n**NFR-2.** Эндпоинт должен поддерживать высокую доступность и производительность.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|------------|----------------|---------|---------------|-------------------------|---------------------------------------------|------------------|\\n| secret | query | string | required | Длина >= 8 символов | Секретный ключ для авторизации | my_secret_key |\\n| offset | query | integer | optional | Положительное число | Смещение для пагинации | 10 |\\n| limit | query | integer | optional | > 0 && <= 100 | Максимальное количество возвращаемых записей | 50 |\\n| timeout | query | integer | optional | >= 0 | Таймаут ожидания ответа | 30 |\\n| allowed_updates | query | array | optional | | Список типов обновлений для фильтрации | [\\\"message\\\"] |\\n\\n#### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|-----------------|-------------|----------------|-------------------|-------------------------------------|--------------------------|--------------------------------|\\n| status | boolean | required | | Успех обработки запроса | true или false | true |\\n| message | string | optional | Максимальная длина 255 символов | Сообщение о результате | \\\"Success\\\" | \\\"Invalid secret key provided\\\"|\\n| data | object | conditional | | Полезная нагрузка результата | Присутствует при статусе true | {} |\\n| messages | array | conditional | | Массив непрочитанных сообщений | Входит в поле data | [] |\\n| message_id | integer | required | | Уникальный идентификатор сообщения | Входит в массив messages | 12345 |\\n| text | string | required | Максимальная длина 4096 символов | Текст сообщения | Входит в массив messages | \\\"Hello world!\\\" |\\n\\n### Интеграции\\n\\n- **Telegram Bot API**: Вызов метода `getUpdates` для получения списка обновлений.\\n\\n### Ошибки\\n\\n- **HTTP 403**: Возникает, если переданный `secret` не совпадает с `APP_ENDPOINT_SECRET`.\\n- **HTTP 500**: Внутренняя ошибка сервера при проблемах взаимодействия с Telegram API.\\n\\n### Связанный код\\n\\nНе предоставлено.\\n\\n### История изменений\\n\\nНе предоставлено.\",\n \"reason\": \"Создание нового документа для описания API-метода `GET /telegram/messages`.\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-08T14:50:17.136336+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260408-161523-4e5327abba47.md b/runtime_traces/agent_requests/20260408-161523-4e5327abba47.md deleted file mode 100644 index 6bad898..0000000 --- a/runtime_traces/agent_requests/20260408-161523-4e5327abba47.md +++ /dev/null @@ -1,1244 +0,0 @@ -# Runtime Trace: 20260408-161523-4e5327abba47 - -- active_rag_session_id: 8b779e8a-565a-40c2-98b5-4e5327abba47 - -## request -```json -{ - "request_id": "req_ee18aaba92894e329ac49a6c6681f264", - "session_id": "as_7a2e6e782575492dba1bafeb6cec7c85", - "active_rag_session_id": "8b779e8a-565a-40c2-98b5-4e5327abba47", - "process_version": "v2", - "created_at": "2026-04-08T16:15:23.271618+00:00", - "message": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по указанному файлу feature1.md.", - "rag_session_id": "8b779e8a-565a-40c2-98b5-4e5327abba47" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "answer_length": 5081, - "issues": 3, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": true, - "answer_len": 5081, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "answer_length": 5081, - "issues": 3, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": true, - "answer_len": 5081, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 5081, - "changeset_items": 1, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует analysis_id в metadata аналитики.\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n\nПлан изменений:\n- create: docs/api/api-telegram-messages-get.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntype: api_method\\ndoc_type: api_method\\nname: telegram_messages_get\\ntitle: Реализация эндпоинта GET /telegram/messages\\nmodule: telegram\\nlayer: application\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-05\\nsource_of_truth: analysis\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Реализация эндпоинта GET /telegram/messages\\n\\n## Summary\\n\\n- Эндпоинт предназначен для получения сообщений из Telegram через метод `getUpdates`.\\n- Используется секретный ключ для проверки доступа.\\n- Поддерживает фильтрацию и лимитирование получаемых обновлений.\\n- Возвращает ответы в формате `AppResponseDto`.\\n\\n## Details\\n\\n### Описание\\nЭндпоинт `GET /telegram/messages` предоставляет возможность получать непрочитанные сообщения из Telegram после успешной аутентификации пользователя по секретному ключу.\\n\\n### Сценарий\\n\\n**Название:** Получение сообщений из Telegram\\n\\n**Предусловия:**\\n- Пользователь имеет действующий секретный ключ.\\n- Доступен токен Telegram-бота.\\n\\n**Триггер:** Вызов эндпоинта `GET /telegram/messages` с параметром `secret`.\\n\\n**Основной сценарий:**\\n1. Проверка соответствия секретного ключа.\\n2. Выполнение запроса к Telegram API методом `getUpdates`.\\n3. Обработка полученных обновлений и формирование ответа.\\n\\n**Альтернативный сценарий:** Неудачная проверка секретного ключа приводит к возврату статуса `403 Forbidden`.\\n\\n**Обработка ошибок:** При ошибке Telegram API возвращается контролируемая ошибка.\\n\\n**Постусловие:** Клиент получает список непрочитанных сообщений или сообщение об ошибке.\\n\\n### Функциональные требования\\n\\n**FR-1.** Проверить соответствие секретного ключа значению `APP_ENDPOINT_SECRET`.\\n**FR-2.** Выполнить запрос к Telegram API методом `getUpdates` при успешном прохождении проверки.\\n**FR-3.** Вернуть результаты в формате `AppResponseDto`.\\n\\n### Нефункциональные требования\\n\\n**NFR-1.** Контролируемая обработка ошибок Telegram API без утечки конфиденциальных данных.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|------------|----------------|---------|---------------|------------------|-------------------------------------------|----------------|\\n| secret | query | string | required | | Секретный ключ для аутентификации | my-secret-key |\\n| offset | query | integer | optional | >= 0 | Идентификатор последнего известного обновления| 100 |\\n| limit | query | integer | optional | > 0 | Максимальное количество получаемых обновлений| 50 |\\n| timeout | query | integer | optional | >= 0 | Время ожидания новых обновлений в секундах | 30 |\\n| allowed_updates | query | array | optional | | Список типов обновлений для фильтрации | [\\\"message\\\"] |\\n\\n#### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|--------------------|------------|---------------|-------------|---------------------------------|---------------|---------------------------|\\n| success | boolean | required | | Флаг успешного выполнения запроса| true | true |\\n| data | object | conditional | | Данные результата | if success=true| {\\\"messages\\\": [...] }|\\n| errorCode | integer | conditional | | Код ошибки | if success=false| 403 |\\n| errorMessage | string | conditional | | Сообщение об ошибке | if success=false| \\\"Forbidden\\\" |\\n| timestamp | datetime | required | | Метка времени выполнения запроса | | \\\"2023-10-05T12:34:56Z\\\" |\\n\\n### Интеграции\\nИнтеграция с Telegram Bot API методом `getUpdates`.\\n\\n### Ошибки\\nПри неверном секретном ключе возвращается статус `403 Forbidden`. При ошибках Telegram API возвращается контролированное сообщение об ошибке.\\n\\n### Связанный код\\nНе предоставлено.\\n\\n### История изменений\\nНе предоставлено.\",\n \"reason\": \"Создание нового документа для описания реализации эндпоинта `GET /telegram/messages`\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-08T16:15:48.284235+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260408-162001-36267a366e93.md b/runtime_traces/agent_requests/20260408-162001-36267a366e93.md deleted file mode 100644 index 8d664c0..0000000 --- a/runtime_traces/agent_requests/20260408-162001-36267a366e93.md +++ /dev/null @@ -1,1274 +0,0 @@ -# Runtime Trace: 20260408-162001-36267a366e93 - -- active_rag_session_id: d72bfd1e-db68-4537-a41b-36267a366e93 - -## request -```json -{ - "request_id": "req_3563cf12b0414a02a7a5e829867972ee", - "session_id": "as_598ad98eaf1c411587b0e08ff65bc3d4", - "active_rag_session_id": "d72bfd1e-db68-4537-a41b-36267a366e93", - "process_version": "v2", - "created_at": "2026-04-08T16:20:01.344793+00:00", - "message": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по системной аналитике из указанного файла feature1.md.", - "rag_session_id": "d72bfd1e-db68-4537-a41b-36267a366e93" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/api/api-telegram-messages-get.md", - "prompt_chars": 13861, - "rules_chars": 11520 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только JSON-объект формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"api.telegram.messages.get\",\n \"title\": \"Реализация эндпоинта `GET /telegram/messages`\",\n \"domain\": \"unknown\",\n \"sub_domain\": \"unknown\",\n \"reason\": \"Из unit 'Реализация эндпоинта `GET /telegram/messages`' системной аналитики (analysis).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Сценарий описывает поведение endpoint и включает все обязательные функциональные требования.\\n\\n1. Потребитель вызывает endpoint `GET /telegram/messages` и передает параметр `secret`.\\n2. Сервис сравнивает переданный `secret` со значением `APP_ENDPOINT_SECRET` из защищенной конфигурации.\\n3. Если `secret` не совпадает:\\n\\n- сервис возвращает отказ в доступе (`403 Forbidden`);\\n- обработка завершается;\\n- вызов в Telegram API не выполняется.\\n\\n1. Если `secret` совпадает, сервис выполняет вызов Telegram Bot API:\\n\\n- Метод: `getUpdates`;\\n- HTTP: `POST https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/getUpdates`;\\n- Допустимые параметры запроса (по необходимости): `offset`, `limit`, `timeout`, `allowed_updates`.\\n\\n1. Сервис получает список update, выделяет непрочитанные (необработанные) сообщения и формирует доменный результат.\\n2. Сервис возвращает клиенту ответ в формате `AppResponseDto` (статус выполнения + полезная нагрузка).\\n3. Если Telegram API возвращает ошибку/некорректный ответ, сервис возвращает контролируемую ошибку без утечки внутренних данных интеграции.\\n\\nНеобходимые секреты для реализации сценария:\\n\\n- `APP_ENDPOINT_SECRET` - секрет для авторизации входящего запроса к endpoint;\\n- `TELEGRAM_BOT_TOKEN` - токен Telegram-бота для вызова метода `getUpdates`.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: api-scenario\\n\\n# API Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `### Сценарий` в API-документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n\\n- Сценарий должен быть лаконичным.\\n- Сценарий должен отражать суть шага.\\n- Сложные технические детали надо выносить в `FR-*`.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"reason\": \"Создание нового документа для описания реализации эндпоинта `GET /telegram/messages`.\",\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntype: api_method\\ndoc_type: api_method\\nname: telegram_messages_get\\ntitle: Реализация эндпоинта GET /telegram/messages\\nmodule: telegram\\nlayer: application\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-05\\nsource_of_truth: analysis\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Реализация эндпоинта GET /telegram/messages\\n\\n## Summary\\n\\nПотребитель вызывает endpoint `GET /telegram/messages`, передавая параметр `secret`. Сервер проверяет совпадение `secret` с конфигурацией приложения и, при успешном сравнении, выполняет запрос к Telegram Bot API методом `getUpdates`. Возвращает список непрочитанных сообщений в формате `AppResponseDto`.\\n\\n## Details\\n\\n## Описание\\n\\nEndpoint реализует получение списка непрочитанных сообщений из Telegram посредством вызова метода `getUpdates` Telegram Bot API.\\n\\n## Сценарий\\n\\n**Название:** Получение списка непрочитанных сообщений\\n\\n**Предусловия:**\\n- Пользователь имеет действующий `secret` и токен бота.\\n\\n**Триггер:** Вызов endpoint `GET /telegram/messages` с параметром `secret`.\\n\\n**Основной сценарий:**\\n1. При вызове endpoint сервер проверяет корректность `secret`.\\n2. Если проверка проходит успешно, сервер делает запрос к Telegram API методом `getUpdates`.\\n3. Сервер обрабатывает полученный ответ и выделяет непрочитанные сообщения.\\n4. Сервер возвращает клиенту сформированный результат в виде `AppResponseDto`.\\n\\n**Альтернативный сценарий:**\\n- Если `secret` некорректен, сервер возвращает статус `403 Forbidden`.\\n\\n**Обработка ошибок:**\\n- В случае ошибок ответа от Telegram API сервер возвращает контролируемую ошибку без раскрытия внутренних данных интеграции.\\n\\n**Постусловие:** Клиент получает список непрочитанных сообщений или сообщение об ошибке доступа.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверка правильности переданного параметра `secret`.\\n**FR-2.** Выполнение запроса к Telegram API методом `getUpdates` при успешной проверке `secret`.\\n**FR-3.** Обработка полученного от Telegram API ответа и выделение непрочитанных сообщений.\\n**FR-4.** Формирование и возврат результата клиенту в формате `AppResponseDto`.\\n**FR-5.** Возврат ошибки доступа (`403 Forbidden`) при некорректном `secret`.\\n**FR-6.** Защита от утечек внутренних данных интеграции в случае ошибок Telegram API.\\n\\n## Нефункциональные требования\\n\\n**NFR-1.** Надежность обработки запросов к Telegram API.\\n**NFR-2.** Производительность и время отклика endpoint.\\n**NFR-3.** Безопасность проверки и хранения `secret`.\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|------------|----------------|-----------|---------------|-----------------------|-----------------------------------|------------|\\n| secret | query | string | required | maxLength=256 | Секретный ключ для авторизации | mySecretKey |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|-------------------|------------|---------------|------------------------|---------------------------------|------------|--------------------------|\\n| status | boolean | required | | Успех выполнения запроса | true | true |\\n| messages | array | optional | items=MessageDto | Список непрочитанных сообщений | | [message1, message2] |\\n| errorDescription | string | conditional | maxLength=1024 | Описание ошибки | | Доступ запрещен |\\n\\n## Интеграции\\n\\nИнтеграция с Telegram Bot API методом `getUpdates`.\\n\\n## Ошибки\\n\\n- **Ошибка доступа (403):** Передан неверный `secret`.\\n- **Ошибка сервера (500):** Не удалось обработать ответ от Telegram API.\\n\\n## Связанный код\\n\\nКод реализации endpoint находится в модуле `telegram`.\\n\\n## История изменений\\n\\nНет истории изменений.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "answer_length": 4797, - "issues": 3, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": true, - "answer_len": 4797, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "answer_length": 4797, - "issues": 3, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": true, - "answer_len": 4797, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 4797, - "changeset_items": 1, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует analysis_id в metadata аналитики.\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n\nПлан изменений:\n- create: docs/api/api-telegram-messages-get.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntype: api_method\\ndoc_type: api_method\\nname: telegram_messages_get\\ntitle: Реализация эндпоинта GET /telegram/messages\\nmodule: telegram\\nlayer: application\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-05\\nsource_of_truth: analysis\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Реализация эндпоинта GET /telegram/messages\\n\\n## Summary\\n\\nПотребитель вызывает endpoint `GET /telegram/messages`, передавая параметр `secret`. Сервер проверяет совпадение `secret` с конфигурацией приложения и, при успешном сравнении, выполняет запрос к Telegram Bot API методом `getUpdates`. Возвращает список непрочитанных сообщений в формате `AppResponseDto`.\\n\\n## Details\\n\\n## Описание\\n\\nEndpoint реализует получение списка непрочитанных сообщений из Telegram посредством вызова метода `getUpdates` Telegram Bot API.\\n\\n## Сценарий\\n\\n**Название:** Получение списка непрочитанных сообщений\\n\\n**Предусловия:**\\n- Пользователь имеет действующий `secret` и токен бота.\\n\\n**Триггер:** Вызов endpoint `GET /telegram/messages` с параметром `secret`.\\n\\n**Основной сценарий:**\\n1. При вызове endpoint сервер проверяет корректность `secret`.\\n2. Если проверка проходит успешно, сервер делает запрос к Telegram API методом `getUpdates`.\\n3. Сервер обрабатывает полученный ответ и выделяет непрочитанные сообщения.\\n4. Сервер возвращает клиенту сформированный результат в виде `AppResponseDto`.\\n\\n**Альтернативный сценарий:**\\n- Если `secret` некорректен, сервер возвращает статус `403 Forbidden`.\\n\\n**Обработка ошибок:**\\n- В случае ошибок ответа от Telegram API сервер возвращает контролируемую ошибку без раскрытия внутренних данных интеграции.\\n\\n**Постусловие:** Клиент получает список непрочитанных сообщений или сообщение об ошибке доступа.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверка правильности переданного параметра `secret`.\\n**FR-2.** Выполнение запроса к Telegram API методом `getUpdates` при успешной проверке `secret`.\\n**FR-3.** Обработка полученного от Telegram API ответа и выделение непрочитанных сообщений.\\n**FR-4.** Формирование и возврат результата клиенту в формате `AppResponseDto`.\\n**FR-5.** Возврат ошибки доступа (`403 Forbidden`) при некорректном `secret`.\\n**FR-6.** Защита от утечек внутренних данных интеграции в случае ошибок Telegram API.\\n\\n## Нефункциональные требования\\n\\n**NFR-1.** Надежность обработки запросов к Telegram API.\\n**NFR-2.** Производительность и время отклика endpoint.\\n**NFR-3.** Безопасность проверки и хранения `secret`.\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|------------|----------------|-----------|---------------|-----------------------|-----------------------------------|------------|\\n| secret | query | string | required | maxLength=256 | Секретный ключ для авторизации | mySecretKey |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|-------------------|------------|---------------|------------------------|---------------------------------|------------|--------------------------|\\n| status | boolean | required | | Успех выполнения запроса | true | true |\\n| messages | array | optional | items=MessageDto | Список непрочитанных сообщений | | [message1, message2] |\\n| errorDescription | string | conditional | maxLength=1024 | Описание ошибки | | Доступ запрещен |\\n\\n## Интеграции\\n\\nИнтеграция с Telegram Bot API методом `getUpdates`.\\n\\n## Ошибки\\n\\n- **Ошибка доступа (403):** Передан неверный `secret`.\\n- **Ошибка сервера (500):** Не удалось обработать ответ от Telegram API.\\n\\n## Связанный код\\n\\nКод реализации endpoint находится в модуле `telegram`.\\n\\n## История изменений\\n\\nНет истории изменений.\",\n \"reason\": \"Создание нового документа для описания реализации эндпоинта `GET /telegram/messages`.\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-08T16:20:22.909822+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-072516-8165fa8703a6.md b/runtime_traces/agent_requests/20260409-072516-8165fa8703a6.md deleted file mode 100644 index 1aa8b1a..0000000 --- a/runtime_traces/agent_requests/20260409-072516-8165fa8703a6.md +++ /dev/null @@ -1,1931 +0,0 @@ -# Runtime Trace: 20260409-072516-8165fa8703a6 - -- active_rag_session_id: e724dd36-f15e-46a4-9393-8165fa8703a6 - -## request -```json -{ - "request_id": "req_c43764841e714791be9dbcb05763097e", - "session_id": "as_f55b643b85e44faea970bfa9a73e9c07", - "active_rag_session_id": "e724dd36-f15e-46a4-9393-8165fa8703a6", - "process_version": "v2", - "created_at": "2026-04-09T07:25:16.328949+00:00", - "message": "Какие методы api есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы api есть в проекте?", - "target_terms": [ - "api" - ], - "anchors": { - "entity_names": [ - "api" - ], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [ - "api" - ], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается перечисления методов API.", - "rag_session_id": "e724dd36-f15e-46a4-9393-8165fa8703a6" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [ - "api" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 4 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 4, - "endpoints": [ - "GET /actions/{action}", - "GET /health", - "GET /send", - "GET /telegram/messages" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 4 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 4 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 66 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 4 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 4 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 66 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 66 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /actions/{action}\nGET /health\nGET /send\nGET /telegram/messages", - "completed_at": "2026-04-09T07:25:18.065640+00:00" -} -``` - -## request -```json -{ - "request_id": "req_48434e060ea045f98766b31dd59e89a5", - "session_id": "as_f55b643b85e44faea970bfa9a73e9c07", - "active_rag_session_id": "e724dd36-f15e-46a4-9393-8165fa8703a6", - "process_version": "v2", - "created_at": "2026-04-09T07:25:30.018672+00:00", - "message": "Какие методы апи относятся к health?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи относятся к health?", - "target_terms": [ - "health" - ], - "anchors": { - "entity_names": [ - "health" - ], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [ - "health", - "healthpayload", - "healthpayload" - ], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.7500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается методов API, связанных с сущностью 'health'.", - "rag_session_id": "e724dd36-f15e-46a4-9393-8165fa8703a6" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.7500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [ - "health" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%health%" - ], - "query_signals": [ - "health" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%health%" - ], - "query_signals": [ - "health" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 1 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 1, - "endpoints": [ - "GET /health" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 1 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 1 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 11 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 1 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 1 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 11 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 11 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /health", - "completed_at": "2026-04-09T07:25:31.687007+00:00" -} -``` - -## request -```json -{ - "request_id": "req_9879559770684d348c30ea40596da0df", - "session_id": "as_f55b643b85e44faea970bfa9a73e9c07", - "active_rag_session_id": "e724dd36-f15e-46a4-9393-8165fa8703a6", - "process_version": "v2", - "created_at": "2026-04-09T07:25:36.109334+00:00", - "message": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по системной аналитике из указанного файла feature1.md.", - "rag_session_id": "e724dd36-f15e-46a4-9393-8165fa8703a6" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 27, - "planned_changes": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 27, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "update", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/api/api-telegram-messages-get.md", - "prompt_chars": 13861, - "rules_chars": 11520 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только JSON-объект формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"update\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"api.telegram.messages.get\",\n \"title\": \"Реализация эндпоинта `GET /telegram/messages`\",\n \"domain\": \"unknown\",\n \"sub_domain\": \"unknown\",\n \"reason\": \"Из unit 'Реализация эндпоинта `GET /telegram/messages`' системной аналитики (analysis).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Сценарий описывает поведение endpoint и включает все обязательные функциональные требования.\\n\\n1. Потребитель вызывает endpoint `GET /telegram/messages` и передает параметр `secret`.\\n2. Сервис сравнивает переданный `secret` со значением `APP_ENDPOINT_SECRET` из защищенной конфигурации.\\n3. Если `secret` не совпадает:\\n\\n- сервис возвращает отказ в доступе (`403 Forbidden`);\\n- обработка завершается;\\n- вызов в Telegram API не выполняется.\\n\\n1. Если `secret` совпадает, сервис выполняет вызов Telegram Bot API:\\n\\n- Метод: `getUpdates`;\\n- HTTP: `POST https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/getUpdates`;\\n- Допустимые параметры запроса (по необходимости): `offset`, `limit`, `timeout`, `allowed_updates`.\\n\\n1. Сервис получает список update, выделяет непрочитанные (необработанные) сообщения и формирует доменный результат.\\n2. Сервис возвращает клиенту ответ в формате `AppResponseDto` (статус выполнения + полезная нагрузка).\\n3. Если Telegram API возвращает ошибку/некорректный ответ, сервис возвращает контролируемую ошибку без утечки внутренних данных интеграции.\\n\\nНеобходимые секреты для реализации сценария:\\n\\n- `APP_ENDPOINT_SECRET` - секрет для авторизации входящего запроса к endpoint;\\n- `TELEGRAM_BOT_TOKEN` - токен Telegram-бота для вызова метода `getUpdates`.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: api-scenario\\n\\n# API Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `### Сценарий` в API-документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n\\n- Сценарий должен быть лаконичным.\\n- Сценарий должен отражать суть шага.\\n- Сложные технические детали надо выносить в `FR-*`.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"update\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"reason\": \"Актуализация эндпоинта `GET /telegram/messages`: требования и сценарий\",\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntype: api_method\\ndoc_type: api_method\\nname: telegram_messages_get\\ntitle: Реализация эндпоинта `GET /telegram/messages'\\nmodule: telegram\\nlayer: application\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: active\\nupdated_at: 2023-10-10\\nsource_of_truth: analysis\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Реализация эндпоинта `GET /telegram/messages`\\n\\n## Summary\\n\\nЭндпоинт предназначен для получения сообщений из Telegram API. Он проверяет корректность входного параметра `secret`, после чего обращается к методу `getUpdates` Telegram API, фильтруя непрочитанные сообщения.\\n\\n## Details\\n\\n## Описание\\n\\nЭндпоинт позволяет получить непрочитанные сообщения из Telegram, выполняя проверку безопасности входного запроса.\\n\\n## Сценарий\\n\\n**Название:** Получение непрочитанных сообщений из Telegram\\n\\n**Предусловия:**\\n- Пользователь передал валидный `secret`.\\n\\n**Триггер:** Вызов эндпоинта `GET /telegram/messages` с параметром `secret`.\\n\\n**Основной сценарий:**\\n1. Поиск совпадения значения `secret` с конфигурационным параметром `APP_ENDPOINT_SECRET`.\\n2. Выполнение вызова метода `getUpdates` Telegram API при успешном совпадении.\\n3. Фильтрация полученных обновлений и формирование ответа.\\n\\n**Альтернативный сценарий:** При неверном `secret` возвращается ошибка доступа.\\n\\n**Обработка ошибок:** В случае ошибки Telegram API формируется контролируемая ошибка без раскрытия конфиденциальных данных.\\n\\n**Постусловие:** Клиент получил список непрочитанных сообщений или сообщение об ошибке.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверка корректности `secret` обязательно перед вызовом Telegram API.\\n**FR-2.** Использование метода `getUpdates` Telegram API с возможными параметрами `offset`, `limit`, `timeout`, `allowed_updates`.\\n**FR-3.** Формирование ответа на основе непрочитанных сообщений.\\n**FR-4.** Обработка ошибок Telegram API без раскрытия внутренней информации.\\n\\n## Нефункциональные требования\\n\\n**NFR-1.** Безопасность передачи секретных параметров.\\n**NFR-2.** Высокая доступность и производительность эндпоинта.\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|----------------|----------------|---------|---------------|---------------------|----------------------------------------------|----------------|\\n| secret | query | string | required | Длина >= 8 символов | Секретный ключ авторизации | ABC123XYZ |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|--------------------|---------------|---------------|--------------|-----------------------------------------|------------------|---------------------|\\n| status | boolean | required | true/false | Результат выполнения | Всегда заполнено | true |\\n| messages | array<object> | optional | maxLength=50 | Список непрочитанных сообщений | При успехе | [{\"text\":\"Привет!\"}{...}] |\\n| errorMessage | string | optional | | Сообщение об ошибке | При ошибке | \"Ошибка доступа\" |\\n\\n## Интеграции\\n\\nИнтеграция с Telegram API посредством метода `getUpdates`.\\n\\n## Ошибки\\n\\n- **HTTP 403**: При несоответствии `secret` с конфигурацией.\\n- **HTTP 500**: Внутренняя ошибка сервера при обработке ответа Telegram API.\\n\\n## Связанный код\\n\\nНе предоставлено.\\n\\n## История изменений\\n\\nНе предоставлено.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 27, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "update", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 0, - "issues": 4, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 27, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "update", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 4, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/api/api-telegram-messages-get.md." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 27, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "update", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 4, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/api/api-telegram-messages-get.md." - ] - }, - "output": { - "answer_length": 464, - "issues": 4, - "changeset_items": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 27, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "update", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 464, - "issues_count": 4, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/api/api-telegram-messages-get.md." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 27, - "planned_changes": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 27, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "update", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 27, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "update", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 0, - "issues": 4, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 27, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "update", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 4, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/api/api-telegram-messages-get.md." - ] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 27, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "update", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 4, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/api/api-telegram-messages-get.md." - ] - }, - "output": { - "answer_length": 464, - "issues": 4, - "changeset_items": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 27, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "update", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 464, - "issues_count": 4, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/api/api-telegram-messages-get.md." - ] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 464, - "changeset_items": 0, - "apply_changeset": false -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует analysis_id в metadata аналитики.\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n- LLM вернул невалидный JSON changeset для docs/api/api-telegram-messages-get.md.\n\nПлан изменений:\n- update: docs/api/api-telegram-messages-get.md (api_method)\n\nChangeset (для плагина):\n```json\n[]\n```\n\napply_changeset: false", - "completed_at": "2026-04-09T07:25:55.649158+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-072648-48cbd7c792dd.md b/runtime_traces/agent_requests/20260409-072648-48cbd7c792dd.md deleted file mode 100644 index 3985aa9..0000000 --- a/runtime_traces/agent_requests/20260409-072648-48cbd7c792dd.md +++ /dev/null @@ -1,1954 +0,0 @@ -# Runtime Trace: 20260409-072648-48cbd7c792dd - -- active_rag_session_id: 5b72440d-8cd2-4c1d-9d1c-48cbd7c792dd - -## request -```json -{ - "request_id": "req_c24fabd2db5747e9b96d7ec81a313563", - "session_id": "as_164f1240ca5e403985013c1fe0f2e191", - "active_rag_session_id": "5b72440d-8cd2-4c1d-9d1c-48cbd7c792dd", - "process_version": "v2", - "created_at": "2026-04-09T07:26:48.662395+00:00", - "message": "Какие методы api есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы api есть в проекте?", - "target_terms": [ - "api" - ], - "anchors": { - "entity_names": [ - "api" - ], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [ - "api" - ], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается перечисления методов API.", - "rag_session_id": "5b72440d-8cd2-4c1d-9d1c-48cbd7c792dd" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [ - "api" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 3 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 3, - "endpoints": [ - "GET /actions/{action}", - "GET /health", - "GET /send" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 3 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 3 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 43 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 3 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 3 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 43 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 43 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /actions/{action}\nGET /health\nGET /send", - "completed_at": "2026-04-09T07:26:50.434817+00:00" -} -``` - -## request -```json -{ - "request_id": "req_f9c6270eb17e47c384ba94ed5532e04c", - "session_id": "as_164f1240ca5e403985013c1fe0f2e191", - "active_rag_session_id": "5b72440d-8cd2-4c1d-9d1c-48cbd7c792dd", - "process_version": "v2", - "created_at": "2026-04-09T07:26:59.815886+00:00", - "message": "Какие методы апи относятся к health?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи относятся к health?", - "target_terms": [ - "health" - ], - "anchors": { - "entity_names": [ - "health" - ], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [ - "health", - "healthpayload", - "healthpayload" - ], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.7500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается методов API, связанных с health.", - "rag_session_id": "5b72440d-8cd2-4c1d-9d1c-48cbd7c792dd" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.7500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [ - "health" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%health%" - ], - "query_signals": [ - "health" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%health%" - ], - "query_signals": [ - "health" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 1 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 1, - "endpoints": [ - "GET /health" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 1 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 1 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 11 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 1 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 1 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 11 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 11 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /health", - "completed_at": "2026-04-09T07:27:01.392076+00:00" -} -``` - -## request -```json -{ - "request_id": "req_7590bfc71f8645caa6004251142cc364", - "session_id": "as_164f1240ca5e403985013c1fe0f2e191", - "active_rag_session_id": "5b72440d-8cd2-4c1d-9d1c-48cbd7c792dd", - "process_version": "v2", - "created_at": "2026-04-09T07:27:04.262369+00:00", - "message": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Напиши документацию по системной аналитике /Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "target_terms": [], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "/users/alex/dev_projects_v2/apps/test_echo_app/_incoming/feature1.md" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на обновление документации по указанному файлу feature1.md.", - "rag_session_id": "5b72440d-8cd2-4c1d-9d1c-48cbd7c792dd" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/api/api-telegram-messages-get.md", - "prompt_chars": 13861, - "rules_chars": 11520 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только JSON-объект формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"api.telegram.messages.get\",\n \"title\": \"Реализация эндпоинта `GET /telegram/messages`\",\n \"domain\": \"unknown\",\n \"sub_domain\": \"unknown\",\n \"reason\": \"Из unit 'Реализация эндпоинта `GET /telegram/messages`' системной аналитики (analysis).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Сценарий описывает поведение endpoint и включает все обязательные функциональные требования.\\n\\n1. Потребитель вызывает endpoint `GET /telegram/messages` и передает параметр `secret`.\\n2. Сервис сравнивает переданный `secret` со значением `APP_ENDPOINT_SECRET` из защищенной конфигурации.\\n3. Если `secret` не совпадает:\\n\\n- сервис возвращает отказ в доступе (`403 Forbidden`);\\n- обработка завершается;\\n- вызов в Telegram API не выполняется.\\n\\n1. Если `secret` совпадает, сервис выполняет вызов Telegram Bot API:\\n\\n- Метод: `getUpdates`;\\n- HTTP: `POST https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/getUpdates`;\\n- Допустимые параметры запроса (по необходимости): `offset`, `limit`, `timeout`, `allowed_updates`.\\n\\n1. Сервис получает список update, выделяет непрочитанные (необработанные) сообщения и формирует доменный результат.\\n2. Сервис возвращает клиенту ответ в формате `AppResponseDto` (статус выполнения + полезная нагрузка).\\n3. Если Telegram API возвращает ошибку/некорректный ответ, сервис возвращает контролируемую ошибку без утечки внутренних данных интеграции.\\n\\nНеобходимые секреты для реализации сценария:\\n\\n- `APP_ENDPOINT_SECRET` - секрет для авторизации входящего запроса к endpoint;\\n- `TELEGRAM_BOT_TOKEN` - токен Telegram-бота для вызова метода `getUpdates`.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: api-scenario\\n\\n# API Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `### Сценарий` в API-документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n\\n- Сценарий должен быть лаконичным.\\n- Сценарий должен отражать суть шага.\\n- Сложные технические детали надо выносить в `FR-*`.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"reason\": \"Создание нового документа для описания API-метода `GET /telegram/messages`.\",\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntype: api_method\\ndoc_type: api_method\\nname: telegram_messages_get\\ntitle: Реализация эндпоинта `GET /telegram/messages'\\nmodule: telegram\\nlayer: application\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-05\\nsource_of_truth: analysis\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Реализация эндпоинта `GET /telegram/messages'\\n\\n## Summary\\n\\nПотребитель вызывает эндпоинт `GET /telegram/messages`, передавая параметр `secret`. Сервис проверяет совпадение секретного ключа и при успешном результате запрашивает обновления сообщений у Telegram API. При ошибке возвращается контроллируемый ответ без раскрытия информации о системе интеграции.\\n\\n## Details\\n\\n## Описание\\n\\nЭндпоинт предоставляет возможность получения обновлений сообщений из Telegram после проверки секретности доступа.\\n\\n## Сценарий\\n\\n**Название:** Проверка секретности и получение обновлений\\n\\n**Предусловия:**\\n- Пользователь аутентифицирован.\\n- Установлен секретный ключ `APP_ENDPOINT_SECRET` и токен бота `TELEGRAM_BOT_TOKEN`.\\n\\n**Триггер:** Вызов эндпоинта `GET /telegram/messages` с параметром `secret`.\\n\\n**Основной сценарий:**\\n1. Своеобразно сравнить предоставленный `secret` с `APP_ENDPOINT_SECRET`.\\n2. При совпадении выполнить запрос к Telegram API методом `getUpdates`.\\n3. Отфильтровать полученные обновления, выделив непрочитанные сообщения.\\n4. Возвращается сформированный ответ в виде `AppResponseDto`.\\n\\n**Альтернативный сценарий:**\\n1. Если `secret` не совпадает, вернуть статус `403 Forbidden`.\\n\\n**Обработка ошибок:**\\n1. При получении некорректного ответа от Telegram API вернуть контролируемую ошибку.\\n\\n**Постусловие:** Клиент получил актуальный набор непрочитанных сообщений или информацию об ошибке.\\n\\n## Функциональные требования\\n\\n**FR-1.** Эндпоинт принимает параметр `secret`.\\n\\n**FR-2.** Выполняется проверка секретности по значению `APP_ENDPOINT_SECRET`.\\n\\n**FR-3.** В случае успешного прохождения проверки вызывается метод Telegram API `getUpdates`.\\n\\n**FR-4.** Из полученных обновлений выделяются непрочитанные сообщения.\\n\\n**FR-5.** Формируется и возвращается ответ в формате `AppResponseDto`.\\n\\n**FR-6.** При возникновении ошибки формируется контролируемый ответ без раскрытия внутренней информации.\\n\\n## Нефункциональные требования\\n\\n**NFR-1.** Ответ должен возвращаться в течение разумного времени.\\n\\n**NFR-2.** Безопасность обработки секретов должна соответствовать стандартам безопасности приложения.\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|------------|----------------|------------|---------------|---------------------|------------------------------------------|------------|\\n| secret | query | string | required | max length=256 | Секретный ключ для доступа к эндпоинту | abcdefghijkl|\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|-----------------|---------------|---------------|-------------|--------------------------------------|------------------------|----------------|\\n| status | boolean | required | | Статус выполнения операции | true/false | true |\\n| messages | array[string] | optional | minLength=0 | Список непрочитанных сообщений | | [\\\"message1\\\"] |\\n| errorMessage | string | optional | maxLength=256| Сообщение об ошибке | | \\\"Error message\\\"|\\n\\n### Интеграции\\n\\nИнтеграция с Telegram API через метод `getUpdates`.\\n\\n### Ошибки\\n\\n- **403 Forbidden**: Неверный секретный ключ.\\n- **500 Internal Server Error**: Внутренняя ошибка сервиса.\\n- **502 Bad Gateway**: Ошибка взаимодействия с Telegram API.\\n\\n## Связанный код\\n\\nКод реализации эндпоинта находится в соответствующем модуле приложения.\\n\\n## История изменений\\n\\nДата | Автор | Изменения\\n----|------|--------\\n\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "answer_length": 4838, - "issues": 3, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": true, - "answer_len": 4838, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 26, - "planned_changes": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "answer_length": 4838, - "issues": 3, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/apps/test_echo_app/_incoming/feature1.md", - "project_root": "/Users/alex/Dev_projects_v2/apps/test_echo_app", - "feature_content_len": 4338, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 1, - "unit_headings": [ - "Реализация эндпоинта `GET /telegram/messages`" - ], - "docs_rows_count": 26, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 1, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/api/api-telegram-messages-get.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api-telegram-messages-get.md" - } - ], - "apply_changeset": true, - "answer_len": 4838, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 4838, - "changeset_items": 1, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует analysis_id в metadata аналитики.\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n\nПлан изменений:\n- create: docs/api/api-telegram-messages-get.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api-telegram-messages-get.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api.telegram.messages.get\\ntype: api_method\\ndoc_type: api_method\\nname: telegram_messages_get\\ntitle: Реализация эндпоинта `GET /telegram/messages'\\nmodule: telegram\\nlayer: application\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-05\\nsource_of_truth: analysis\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Реализация эндпоинта `GET /telegram/messages'\\n\\n## Summary\\n\\nПотребитель вызывает эндпоинт `GET /telegram/messages`, передавая параметр `secret`. Сервис проверяет совпадение секретного ключа и при успешном результате запрашивает обновления сообщений у Telegram API. При ошибке возвращается контроллируемый ответ без раскрытия информации о системе интеграции.\\n\\n## Details\\n\\n## Описание\\n\\nЭндпоинт предоставляет возможность получения обновлений сообщений из Telegram после проверки секретности доступа.\\n\\n## Сценарий\\n\\n**Название:** Проверка секретности и получение обновлений\\n\\n**Предусловия:**\\n- Пользователь аутентифицирован.\\n- Установлен секретный ключ `APP_ENDPOINT_SECRET` и токен бота `TELEGRAM_BOT_TOKEN`.\\n\\n**Триггер:** Вызов эндпоинта `GET /telegram/messages` с параметром `secret`.\\n\\n**Основной сценарий:**\\n1. Своеобразно сравнить предоставленный `secret` с `APP_ENDPOINT_SECRET`.\\n2. При совпадении выполнить запрос к Telegram API методом `getUpdates`.\\n3. Отфильтровать полученные обновления, выделив непрочитанные сообщения.\\n4. Возвращается сформированный ответ в виде `AppResponseDto`.\\n\\n**Альтернативный сценарий:**\\n1. Если `secret` не совпадает, вернуть статус `403 Forbidden`.\\n\\n**Обработка ошибок:**\\n1. При получении некорректного ответа от Telegram API вернуть контролируемую ошибку.\\n\\n**Постусловие:** Клиент получил актуальный набор непрочитанных сообщений или информацию об ошибке.\\n\\n## Функциональные требования\\n\\n**FR-1.** Эндпоинт принимает параметр `secret`.\\n\\n**FR-2.** Выполняется проверка секретности по значению `APP_ENDPOINT_SECRET`.\\n\\n**FR-3.** В случае успешного прохождения проверки вызывается метод Telegram API `getUpdates`.\\n\\n**FR-4.** Из полученных обновлений выделяются непрочитанные сообщения.\\n\\n**FR-5.** Формируется и возвращается ответ в формате `AppResponseDto`.\\n\\n**FR-6.** При возникновении ошибки формируется контролируемый ответ без раскрытия внутренней информации.\\n\\n## Нефункциональные требования\\n\\n**NFR-1.** Ответ должен возвращаться в течение разумного времени.\\n\\n**NFR-2.** Безопасность обработки секретов должна соответствовать стандартам безопасности приложения.\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|------------|----------------|------------|---------------|---------------------|------------------------------------------|------------|\\n| secret | query | string | required | max length=256 | Секретный ключ для доступа к эндпоинту | abcdefghijkl|\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|-----------------|---------------|---------------|-------------|--------------------------------------|------------------------|----------------|\\n| status | boolean | required | | Статус выполнения операции | true/false | true |\\n| messages | array[string] | optional | minLength=0 | Список непрочитанных сообщений | | [\\\"message1\\\"] |\\n| errorMessage | string | optional | maxLength=256| Сообщение об ошибке | | \\\"Error message\\\"|\\n\\n### Интеграции\\n\\nИнтеграция с Telegram API через метод `getUpdates`.\\n\\n### Ошибки\\n\\n- **403 Forbidden**: Неверный секретный ключ.\\n- **500 Internal Server Error**: Внутренняя ошибка сервиса.\\n- **502 Bad Gateway**: Ошибка взаимодействия с Telegram API.\\n\\n## Связанный код\\n\\nКод реализации эндпоинта находится в соответствующем модуле приложения.\\n\\n## История изменений\\n\\nДата | Автор | Изменения\\n----|------|--------\\n\",\n \"reason\": \"Создание нового документа для описания API-метода `GET /telegram/messages`.\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-09T07:27:27.085458+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-143441-a16face9a0ab.md b/runtime_traces/agent_requests/20260409-143441-a16face9a0ab.md deleted file mode 100644 index 4577af2..0000000 --- a/runtime_traces/agent_requests/20260409-143441-a16face9a0ab.md +++ /dev/null @@ -1,347 +0,0 @@ -# Runtime Trace: 20260409-143441-a16face9a0ab - -- active_rag_session_id: 3d1215ce-79fc-4c87-bf29-a16face9a0ab - -## request -```json -{ - "request_id": "req_11c7ba17c1fa47faa497f324f165c1ee", - "session_id": "as_7827e863066042b2a6b4be9e8153acdf", - "active_rag_session_id": "3d1215ce-79fc-4c87-bf29-a16face9a0ab", - "process_version": "v2", - "created_at": "2026-04-09T14:34:41.894633+00:00", - "message": "Какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", - "target_terms": [ - "методы", - "апи", - "проекте" - ], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "unknown", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.9500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается перечня доступных API-методов.", - "rag_session_id": "3d1215ce-79fc-4c87-bf29-a16face9a0ab" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.9500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [ - "методы", - "апи", - "проекте" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%методы%", - "%апи%", - "%проекте%" - ], - "query_signals": [ - "методы", - "апи", - "проекте" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%методы%", - "%апи%", - "%проекте%" - ], - "query_signals": [ - "методы", - "апи", - "проекте" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 0 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0, - "endpoints": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 0 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 62 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 0 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 0 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 62 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "insufficient_evidence", - "answer_length": 62 -} -``` - -## result -```json -{ - "status": "done", - "answer": "Не нашёл задокументированных API-эндпоинтов в выбранном scope.", - "completed_at": "2026-04-09T14:34:43.947325+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-143722-a9b20eb67e95.md b/runtime_traces/agent_requests/20260409-143722-a9b20eb67e95.md deleted file mode 100644 index 058c508..0000000 --- a/runtime_traces/agent_requests/20260409-143722-a9b20eb67e95.md +++ /dev/null @@ -1,323 +0,0 @@ -# Runtime Trace: 20260409-143722-a9b20eb67e95 - -- active_rag_session_id: 35471db5-4c18-415d-b48e-a9b20eb67e95 - -## request -```json -{ - "request_id": "req_2980c9e2eb324182a000e72b8307a56d", - "session_id": "as_20c1a7f7aaec4885bc268beff2cae6a0", - "active_rag_session_id": "35471db5-4c18-415d-b48e-a9b20eb67e95", - "process_version": "v2", - "created_at": "2026-04-09T14:37:22.885815+00:00", - "message": "Какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается списка доступных API-методов проекта.", - "rag_session_id": "35471db5-4c18-415d-b48e-a9b20eb67e95" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 2 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0, - "endpoints": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 0 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 62 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 2 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 0 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 62 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "insufficient_evidence", - "answer_length": 62 -} -``` - -## result -```json -{ - "status": "done", - "answer": "Не нашёл задокументированных API-эндпоинтов в выбранном scope.", - "completed_at": "2026-04-09T14:37:24.566326+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-145546-36056dd8dcfe.md b/runtime_traces/agent_requests/20260409-145546-36056dd8dcfe.md deleted file mode 100644 index 35f3f5d..0000000 --- a/runtime_traces/agent_requests/20260409-145546-36056dd8dcfe.md +++ /dev/null @@ -1,323 +0,0 @@ -# Runtime Trace: 20260409-145546-36056dd8dcfe - -- active_rag_session_id: 2d21c11a-66a3-464f-9e0f-36056dd8dcfe - -## request -```json -{ - "request_id": "req_ada6c4f21ef84484ae228a784f854fd8", - "session_id": "as_0190277b106e4573875b6923235196f7", - "active_rag_session_id": "2d21c11a-66a3-464f-9e0f-36056dd8dcfe", - "process_version": "v2", - "created_at": "2026-04-09T14:55:46.412183+00:00", - "message": "Какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается списка доступных API-методов проекта.", - "rag_session_id": "2d21c11a-66a3-464f-9e0f-36056dd8dcfe" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 2 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0, - "endpoints": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 0 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 62 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 2 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 0 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 62 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "insufficient_evidence", - "answer_length": 62 -} -``` - -## result -```json -{ - "status": "done", - "answer": "Не нашёл задокументированных API-эндпоинтов в выбранном scope.", - "completed_at": "2026-04-09T14:55:48.141440+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-151154-b91584f20703.md b/runtime_traces/agent_requests/20260409-151154-b91584f20703.md deleted file mode 100644 index d0bb3e3..0000000 --- a/runtime_traces/agent_requests/20260409-151154-b91584f20703.md +++ /dev/null @@ -1,323 +0,0 @@ -# Runtime Trace: 20260409-151154-b91584f20703 - -- active_rag_session_id: 43fa52d5-9de5-42df-a893-b91584f20703 - -## request -```json -{ - "request_id": "req_934d42145442462a933fdc2c947d40f1", - "session_id": "as_00827751b492436dad07247663772b07", - "active_rag_session_id": "43fa52d5-9de5-42df-a893-b91584f20703", - "process_version": "v2", - "created_at": "2026-04-09T15:11:54.906256+00:00", - "message": "Какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается перечисления методов API.", - "rag_session_id": "43fa52d5-9de5-42df-a893-b91584f20703" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 2 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0, - "endpoints": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 0 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 62 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 2 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 0 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 62 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "insufficient_evidence", - "answer_length": 62 -} -``` - -## result -```json -{ - "status": "done", - "answer": "Не нашёл задокументированных API-эндпоинтов в выбранном scope.", - "completed_at": "2026-04-09T15:11:56.675323+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-151329-2d1087092e43.md b/runtime_traces/agent_requests/20260409-151329-2d1087092e43.md deleted file mode 100644 index 30cdb99..0000000 --- a/runtime_traces/agent_requests/20260409-151329-2d1087092e43.md +++ /dev/null @@ -1,323 +0,0 @@ -# Runtime Trace: 20260409-151329-2d1087092e43 - -- active_rag_session_id: 8be14345-e958-4753-9057-2d1087092e43 - -## request -```json -{ - "request_id": "req_05929401b62a4c85974ffb7eb543a682", - "session_id": "as_a9ce0b45b3ba46aa89c0454462cabb54", - "active_rag_session_id": "8be14345-e958-4753-9057-2d1087092e43", - "process_version": "v2", - "created_at": "2026-04-09T15:13:29.796982+00:00", - "message": "Какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается перечисления методов API.", - "rag_session_id": "8be14345-e958-4753-9057-2d1087092e43" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 2 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0, - "endpoints": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 0 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 62 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 2 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 0 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 62 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "insufficient_evidence", - "answer_length": 62 -} -``` - -## result -```json -{ - "status": "done", - "answer": "Не нашёл задокументированных API-эндпоинтов в выбранном scope.", - "completed_at": "2026-04-09T15:13:31.532828+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-151338-51ca80f9145e.md b/runtime_traces/agent_requests/20260409-151338-51ca80f9145e.md deleted file mode 100644 index fbba414..0000000 --- a/runtime_traces/agent_requests/20260409-151338-51ca80f9145e.md +++ /dev/null @@ -1,323 +0,0 @@ -# Runtime Trace: 20260409-151338-51ca80f9145e - -- active_rag_session_id: eb664e6b-655a-46ca-b7e9-51ca80f9145e - -## request -```json -{ - "request_id": "req_4031d419064f454f97e0872671bbd00a", - "session_id": "as_20977051bd8c4e6fa68cb489934fb998", - "active_rag_session_id": "eb664e6b-655a-46ca-b7e9-51ca80f9145e", - "process_version": "v2", - "created_at": "2026-04-09T15:13:38.600938+00:00", - "message": "Какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается списка доступных API-методов.", - "rag_session_id": "eb664e6b-655a-46ca-b7e9-51ca80f9145e" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 2 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0, - "endpoints": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 0 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 0 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 62 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 2 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 0 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 62 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "insufficient_evidence", - "answer_length": 62 -} -``` - -## result -```json -{ - "status": "done", - "answer": "Не нашёл задокументированных API-эндпоинтов в выбранном scope.", - "completed_at": "2026-04-09T15:13:41.304004+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-151841-faa90484f29c.md b/runtime_traces/agent_requests/20260409-151841-faa90484f29c.md deleted file mode 100644 index 277f525..0000000 --- a/runtime_traces/agent_requests/20260409-151841-faa90484f29c.md +++ /dev/null @@ -1,1705 +0,0 @@ -# Runtime Trace: 20260409-151841-faa90484f29c - -- active_rag_session_id: 1319a27b-7c22-497b-a6b9-faa90484f29c - -## request -```json -{ - "request_id": "req_2c526e5b5d914b7b980206a5683d22f3", - "session_id": "as_43b29112fac3422d92150291a4237eab", - "active_rag_session_id": "1319a27b-7c22-497b-a6b9-faa90484f29c", - "process_version": "v2", - "created_at": "2026-04-09T15:18:41.036396+00:00", - "message": "Какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается перечисления методов API.", - "rag_session_id": "1319a27b-7c22-497b-a6b9-faa90484f29c" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 2 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2, - "endpoints": [ - "GET /api/v1/clients/contacts-dgr", - "GET /api/v1/clients/contacts-dgr/{contactid}" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 2 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 77 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 2 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 2 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 77 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 77 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /api/v1/clients/contacts-dgr\nGET /api/v1/clients/contacts-dgr/{contactid}", - "completed_at": "2026-04-09T15:18:42.787138+00:00" -} -``` - -## request -```json -{ - "request_id": "req_cdece7e20b064fd58e052326a067925e", - "session_id": "as_43b29112fac3422d92150291a4237eab", - "active_rag_session_id": "1319a27b-7c22-497b-a6b9-faa90484f29c", - "process_version": "v2", - "created_at": "2026-04-09T15:19:38.089590+00:00", - "message": "Сформируй документацию по системной аналитике\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Сформируй документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "process/v2/test_doc/features/create_contact.md" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ] - }, - "confidence": 0.9, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос содержит указание сформировать документацию по системной аналитике из конкретного файла create_contact.md.", - "rag_session_id": "1319a27b-7c22-497b-a6b9-faa90484f29c" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.9 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 2, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.plan_change_units", - "system_prompt": "Ты классифицируешь units системной аналитики для построения плана изменений документации.\n\nВерни только JSON:\n{\n \"items\": [\n {\"index\": 0, \"doc_type\": \"api_method\", \"reason\": \"...\"}\n ]\n}\n\nПравила:\n- Используй только doc_type из allowed_doc_types.\n- Не пропускай item, даже если не уверен: выбери наиболее близкий тип.\n- Ориентируйся на heading и snippet.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"system_rules\": \"Системные правила документации:\\n1. Один устойчивый объект — один документ.\\n2. Документы не должны дублировать друг друга по смыслу.\\n3. Связи между документами должны быть явными (related_docs/links).\\n4. Документация организована иерархически по папкам docs/*.\\n5. Markdown-документ состоит из YAML frontmatter и body.\\n6. Обязательные поля frontmatter: id, title, doc_type, related_docs, status, domain, sub_domain.\",\n \"allowed_doc_types\": [\n \"ui_page\",\n \"api_method\",\n \"logic_block\",\n \"architecture_overview\",\n \"integration_doc\",\n \"domain_entity\",\n \"glossary_item\",\n \"index_page\"\n ],\n \"items\": [\n {\n \"index\": 0,\n \"heading\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"snippet\": \"- `type`: `ui.page`\\n- `id`: `ui.contacts_dgr.create`\\n\\nОсновной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- `ui.contacts_dgr` вызывает endpoint `POST /api/v1/clients/contacts-dgr` для создания карточки контакта ДГР.\\n- `ufs.contacts_dgr` обрабатывает запрос и возвращает ответ.\\n- `ui.contacts_dgr` отображает результат создания контакта ДГР в виде push-уведомле\"\n },\n {\n \"index\": 1,\n \"heading\": \"FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`\",\n \"snippet\": \"- `type`: `api_method`\\n- `id`: `ufs.contacts_dgr.api.create`\\n- `endpoint`: `POST /api/v1/clients/contacts-dgr`\\n\\nТребования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом `BAD_REQUEST`.\\n- Авторизовать запрос по наличию периметра `CI02792632.ContactsDGR.Create`. При отсутствии периметра завершить основной сценарий с кодом `UNAU\"\n }\n ]\n}", - "log_context": "workflow.v2.docs_update.from_feature.plan" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"items\": [\n {\"index\": 0, \"doc_type\": \"ui_page\"},\n {\"index\": 1, \"doc_type\": \"api_method\"}\n ]\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "prompt_chars": 15694, - "rules_chars": 11520 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только JSON-объект формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"api_method.fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr\",\n \"title\": \"FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`\",\n \"domain\": \"unknown\",\n \"sub_domain\": \"unknown\",\n \"reason\": \"Из unit 'FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`' системной аналитики (analysis).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"- `type`: `api_method`\\n- `id`: `ufs.contacts_dgr.api.create`\\n- `endpoint`: `POST /api/v1/clients/contacts-dgr`\\n\\nТребования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом `BAD_REQUEST`.\\n- Авторизовать запрос по наличию периметра `CI02792632.ContactsDGR.Create`. При отсутствии периметра завершить основной сценарий с кодом `UNAUTHORIZED`.\\n- Для исполнения запроса на создание контакта вызвать endpoint `POST /contacts` в `prpb.contacts_dgr`.\\n- Вернуть ответ `ui.contacts_dgr` в формате `UfsBaseResponseContactDGRCreateRsDto`.\\n\\nКонтракт `POST /contacts`\\n\\nЗапрос\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\nОтвет\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор контакта |\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: api-scenario\\n\\n# API Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `### Сценарий` в API-документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n\\n- Сценарий должен быть лаконичным.\\n- Сценарий должен отражать суть шага.\\n- Сложные технические детали надо выносить в `FR-*`.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис клиентов_post_api_v1_clients_contacts_dgr.md\",\n \"reason\": \"Создание нового API-метода `POST /api/v1/clients/contacts-dgr` на основе unit 'FR2. Реализовать сервис CLIENTS.' из системной аналитики.\",\n \"proposed_content\": \"---\\nid: api_method.fr2_реализовать_сервис_клиентов_post_api_v1_clients_contacts_dgr\\ntype: api_method\\ndoc_type: api_method\\nname: fr2_реализовать_сервис_клиентов_post_api_v1_clients_contacts_dgr\\ntitle: FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\nsource_of_truth: analysis\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`\\n\\n## Summary\\n\\nМетод реализует функционал создания контактов DGR в системе CLIENTS. Использование требует авторизации с периметром `CI02792632.ContactsDGR.Create`. Входящие данные проверяются на соответствие JSON-схеме. Возвращает созданный объект контакта в формате `UfsBaseResponseContactDGRCreateRsDto`.\\n\\n## Details\\n\\n### Описание\\n\\nAPI-метод предназначен для создания новых контактов DGR в системе CLIENTS.\\n\\n### Сценарий\\n\\n**Название:** Создание контакта DGR\\n\\n**Предусловия:**\\n- Пользователь имеет доступ к периметру `CI02792632.ContactsDGR.Create`.\\n- Отправлен корректный запрос с данными контакта.\\n\\n**Триггер:**\\nОтправка POST-запроса на `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность входящих данных согласно JSON-схеме.\\n2. Проведение авторизации через периметр доступа.\\n3. По успешному прохождению проверки отправляется запрос на backend-сервис для создания контакта.\\n4. Возвращается идентификатор созданного контакта.\\n\\n**Альтернативный сценарий:**\\n- Если данные не соответствуют схеме – возвращается ошибка `BAD_REQUEST`.\\n- Отсутствие необходимого периметра доступа приводит к ошибке `UNAUTHORIZED`.\\n\\n**Обработка ошибок:**\\nОписана в разделе **Ошибки**.\\n\\n**Постусловие:**\\nСоздан новый контакт DGR в системе CLIENTS.\\n\\n### Функциональные требования\\n\\n**FR-1.** Входящие данные должны соответствовать JSON-схеме. В случае несоответствия метод возвращает ошибку `BAD_REQUEST`.\\n\\n**FR-2.** Запрос должен быть авторизован с использованием периметра доступа `CI02792632.ContactsDGR.Create`. Без него возврат ошибки `UNAUTHORIZED`.\\n\\n**FR-3.** Метод вызывает endpoint `POST /contacts` сервиса `prpb.contacts_dgr` для создания контакта.\\n\\n**FR-4.** Ответ формируется в виде объекта `UfsBaseResponseContactDGRCreateRsDto`.\\n\\n### Нефункциональные требования\\n\\nНе указаны.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n| Атрибут | Обязательность | Тип | Где передается | Описание |\\n|------------------------|---------------|---------------|-----------------|---------------------------------------|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя |\\n| contact | 1 | object | body | Данные контакта DGR |\\n| contact.lastName | 0..1 | string(100) | body | Фамилия контакта |\\n| contact.firstName | 0..1 | string(100) | body | Имя контакта |\\n| contact.middleName | 0..1 | string(100) | body | Отчество контакта |\\n| contact.name | 0..1 | string(100) | body | Название группового контакта |\\n| contact.description | 0..1 | string(1000) | body | Описание группового контакта |\\n| contact.position | 0..1 | string(100) | body | Должность контакта у клиента |\\n| contact.comment | 0..1 | string(1000) | body | Комментарий к контакту |\\n| contact.contactType | 1 | enum(string) | body | Тип контакта: Individual, Group |\\n| contact.crossboarding | 1 | boolean | body | Признак принадлежности к онбордингу |\\n| contact.createdBy | 1 | string(8) | body | Табельный номер создателя контакта |\\n| contact.emails | 0..1 | array(object) | body | Массив электронных адресов контакта |\\n| contact.emails.value | 1 | string(100) | body | Электронная почта |\\n| contact.emails.main | 1 | boolean | body | Признак основной почты |\\n| contact.phones | 0..1 | array(object) | body | Массив телефонных номеров контакта |\\n| contact.phones.value | 1 | string(20) | body | Номер телефона |\\n| contact.phones.extValue | 0..1 | string(10) | body | Внутренний добавочный номер |\\n| contact.phones.main | 1 | boolean | body | Признак основного номера телефона |\\n| contact.phones.mobile | 1 | boolean | body | Признак мобильного телефона |\\n| client | 1 | object | body | Данные клиента |\\n| client.ucpId | 0..1 | string(36) | body | Идентификатор клиента ПАО |\\n| client.sbpId | 0..1 | string(36) | body | Идентификатор клиента АО |\\n| client.inn | 0..1 | string(12) | body | ИНН клиента |\\n| client.kpp | 0..1 | string(9) | body | КПП клиента |\\n\\n#### Выходные параметры\\n\\n| Атрибут | Тип | Обязательность | Описание |\\n|----------------|--------------|---------------|----------------------|\\n| contactId | string(36) | 1 | Идентификатор контакта|\\n\\n### Интеграции\\n\\nИнтеграция с сервисом `prpb.contacts_dgr` через endpoint `POST /contacts`.\\n\\n### Ошибки\\n\n- `BAD_REQUEST`: Входящие данные не соответствуют JSON-схеме.\\n- `UNAUTHORIZED`: Нет необходимых прав доступа.\\n\\n### Связанный код\\n\\nНе указан.\\n\\n### История изменений\\n\\nНе указана.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 0, - "issues": 5, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 5, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "Для doc_type 'ui_page' не найдено полных doc_rules (artifact/template).", - "LLM вернул невалидный JSON changeset для docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 5, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "Для doc_type 'ui_page' не найдено полных doc_rules (artifact/template).", - "LLM вернул невалидный JSON changeset для docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md." - ] - }, - "output": { - "answer_length": 744, - "issues": 5, - "changeset_items": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 744, - "issues_count": 5, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "Для doc_type 'ui_page' не найдено полных doc_rules (artifact/template).", - "LLM вернул невалидный JSON changeset для docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "", - "domains": [], - "subdomains": [], - "units": 2, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 0, - "issues": 5, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 5, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "Для doc_type 'ui_page' не найдено полных doc_rules (artifact/template).", - "LLM вернул невалидный JSON changeset для docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md." - ] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 5, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "Для doc_type 'ui_page' не найдено полных doc_rules (artifact/template).", - "LLM вернул невалидный JSON changeset для docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md." - ] - }, - "output": { - "answer_length": 744, - "issues": 5, - "changeset_items": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6116, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 744, - "issues_count": 5, - "issues_preview": [ - "Отсутствует analysis_id в metadata аналитики.", - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "Для doc_type 'ui_page' не найдено полных doc_rules (artifact/template).", - "LLM вернул невалидный JSON changeset для docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md." - ] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 744, - "changeset_items": 0, - "apply_changeset": false -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует analysis_id в metadata аналитики.\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n- Для doc_type 'ui_page' не найдено полных doc_rules (artifact/template).\n- LLM вернул невалидный JSON changeset для docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md.\n\nПлан изменений:\n- create: docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md (ui_page)\n- create: docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md (api_method)\n\nChangeset (для плагина):\n```json\n[]\n```\n\napply_changeset: false", - "completed_at": "2026-04-09T15:20:16.339097+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-152858-906a9a1ffd45.md b/runtime_traces/agent_requests/20260409-152858-906a9a1ffd45.md deleted file mode 100644 index 97c25c6..0000000 --- a/runtime_traces/agent_requests/20260409-152858-906a9a1ffd45.md +++ /dev/null @@ -1,1434 +0,0 @@ -# Runtime Trace: 20260409-152858-906a9a1ffd45 - -- active_rag_session_id: 2c3ee31d-a71c-4eaa-ba7c-906a9a1ffd45 - -## request -```json -{ - "request_id": "req_d6406bfd9e05450ca0878f3a90c2bdee", - "session_id": "as_c6a09ddd19cf4a7d98beed7b65cfa0fb", - "active_rag_session_id": "2c3ee31d-a71c-4eaa-ba7c-906a9a1ffd45", - "process_version": "v2", - "created_at": "2026-04-09T15:28:58.212900+00:00", - "message": "Сформируй документацию по системной аналитике\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Сформируй документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "process/v2/test_doc/features/create_contact.md" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ] - }, - "confidence": 0.9500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на формирование документации по системной аналитике из указанного файла create_contact.md.", - "rag_session_id": "2c3ee31d-a71c-4eaa-ba7c-906a9a1ffd45" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.9500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units": 2, - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.plan_change_units", - "system_prompt": "Ты классифицируешь units системной аналитики для построения плана изменений документации.\n\nВерни только JSON:\n{\n \"items\": [\n {\"index\": 0, \"doc_type\": \"api_method\", \"reason\": \"...\"}\n ]\n}\n\nПравила:\n- Используй только doc_type из allowed_doc_types.\n- Не пропускай item, даже если не уверен: выбери наиболее близкий тип.\n- Ориентируйся на heading и snippet.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"system_rules\": \"Системные правила документации:\\n1. Один устойчивый объект — один документ.\\n2. Документы не должны дублировать друг друга по смыслу.\\n3. Связи между документами должны быть явными (related_docs/links).\\n4. Документация организована иерархически по папкам docs/*.\\n5. Markdown-документ состоит из YAML frontmatter и body.\\n6. Обязательные поля frontmatter: id, title, doc_type, related_docs, status, domain, sub_domain.\",\n \"allowed_doc_types\": [\n \"ui_page\",\n \"api_method\",\n \"logic_block\",\n \"architecture_overview\",\n \"integration_doc\",\n \"domain_entity\",\n \"glossary_item\",\n \"index_page\"\n ],\n \"items\": [\n {\n \"index\": 0,\n \"heading\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"snippet\": \"- `type`: `ui.page`\\n- `id`: `ui.contacts_dgr.create`\\n\\nОсновной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- `ui.contacts_dgr` вызывает endpoint `POST /api/v1/clients/contacts-dgr` для создания карточки контакта ДГР.\\n- `ufs.contacts_dgr` обрабатывает запрос и возвращает ответ.\\n- `ui.contacts_dgr` отображает результат создания контакта ДГР в виде push-уведомле\"\n },\n {\n \"index\": 1,\n \"heading\": \"FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`\",\n \"snippet\": \"- `type`: `api_method`\\n- `id`: `ufs.contacts_dgr.api.create`\\n- `endpoint`: `POST /api/v1/clients/contacts-dgr`\\n\\nТребования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом `BAD_REQUEST`.\\n- Авторизовать запрос по наличию периметра `CI02792632.ContactsDGR.Create`. При отсутствии периметра завершить основной сценарий с кодом `UNAU\"\n }\n ]\n}", - "log_context": "workflow.v2.docs_update.from_feature.plan" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"items\": [\n {\"index\": 0, \"doc_type\": \"ui_page\"},\n {\"index\": 1, \"doc_type\": \"api_method\"}\n ]\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "ui_page", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "prompt_chars": 11080, - "rules_chars": 9572 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только JSON-объект формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\",\n \"doc_type\": \"ui_page\",\n \"doc_id\": \"ui_page.fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\",\n \"title\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"domain\": \"unknown\",\n \"sub_domain\": \"unknown\",\n \"reason\": \"Из unit 'FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"- `type`: `ui.page`\\n- `id`: `ui.contacts_dgr.create`\\n\\nОсновной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- `ui.contacts_dgr` вызывает endpoint `POST /api/v1/clients/contacts-dgr` для создания карточки контакта ДГР.\\n- `ufs.contacts_dgr` обрабатывает запрос и возвращает ответ.\\n- `ui.contacts_dgr` отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (ui_page)\\n\\n# UI Page Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `ui_page`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одной пользовательской страницы, экрана или отдельного UI-сценария.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\n## Что описывать в Details\\n\\n- назначение страницы\\n- пользовательский сценарий\\n- основные блоки интерфейса\\n- связанные API и сущности\\n\\n## Template (ui_page)\\n\\n---\\nid: ui.example_page\\ntype: ui_page\\ndoc_type: ui_page\\nname: example_page\\ntitle: Пример UI-страницы\\nmodule: example_module\\nlayer: presentation\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Пример UI-страницы\\n\\n## Summary\\n\\nКраткое описание страницы и её назначения.\\n\\n## Details\\n\\n### Назначение страницы\\n\\n### Пользовательский сценарий\\n\\n### Основные блоки интерфейса\\n\\n### Связанные API и сущности\\n\\n### Функциональные требования\\n\\n### Нефункциональные требования\\n\\n### Ограничения и граничные случаи\\n\\n### Ошибки и валидации\\n\\n### Связанный код\\n\\n### Связанные документы\\n\\n### История изменений\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\",\n \"reason\": \"Создание нового UI-документа для сценария 'Контакты ДГР. Создание карточки контакта ДГР'\",\n \"proposed_content\": \"---\\nid: ui_page.fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\\ntype: ui_page\\ndoc_type: ui_page\\nname: fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\n\n## Summary\n\n- **Назначение**: Реализация сценария добавления новой карточки контакта ДГР.\n- **Актер**: Пользователь.\n- **Триггер**: Заполнение атрибутов карточки и нажатие кнопки «Добавить».\n- **Связанные API**: `POST /api/v1/clients/contacts-dgr`.\n- **Обработка ответа**: Отображение результата в виде push-уведомления.\n\n## Details\n\n### Назначение страницы\n\nРеализует функционал создания новой карточки контакта ДГР пользователем.\n\n### Пользовательский сценарий\n\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\n- Интерфейс (`ui.contacts_dgr`) отправляет POST-запрос на серверную сущность (`ufs.contacts_dgr`), используя endpoint `/api/v1/clients/contacts-dgr`.\n- После обработки запроса сервер возвращает ответ, который интерфейс отображает пользователю в виде push-уведомления.\n\n### Основные блоки интерфейса\n\nНе указано специфических блоков интерфейса.\n\n### Связанные API и сущности\n\n- API: `POST /api/v1/clients/contacts-dgr`\n- Сущности: `ufs.contacts_dgr`\n\n### Функциональные требования\n\n- **FR-1**: При успешном создании контакта отображается push-уведомление.\n- **FR-2**: Проверка корректности введенных данных перед отправкой запроса.\n\n### Нефункциональные требования\n\nНе указаны специфические нефункциональные требования.\n\n### Ограничения и граничные случаи\n\nНе описаны дополнительные ограничения и граничные сценарии.\n\n### Ошибки и валидации\n\nОписаны в разделе \\\"Функциональные требования\\\" под номером FR-2.\n\n### Связанный код\n\nНе указан конкретный связанный код.\n\n### Связанные документы\n\nОтсутствуют.\n\n### История изменений\n\nНе указана история изменений.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "prompt_chars": 15690, - "rules_chars": 11520 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только JSON-объект формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"api_method.fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr\",\n \"title\": \"FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`\",\n \"domain\": \"unknown\",\n \"sub_domain\": \"unknown\",\n \"reason\": \"Из unit 'FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"- `type`: `api_method`\\n- `id`: `ufs.contacts_dgr.api.create`\\n- `endpoint`: `POST /api/v1/clients/contacts-dgr`\\n\\nТребования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом `BAD_REQUEST`.\\n- Авторизовать запрос по наличию периметра `CI02792632.ContactsDGR.Create`. При отсутствии периметра завершить основной сценарий с кодом `UNAUTHORIZED`.\\n- Для исполнения запроса на создание контакта вызвать endpoint `POST /contacts` в `prpb.contacts_dgr`.\\n- Вернуть ответ `ui.contacts_dgr` в формате `UfsBaseResponseContactDGRCreateRsDto`.\\n\\nКонтракт `POST /contacts`\\n\\nЗапрос\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\nОтвет\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор контакта |\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: api-scenario\\n\\n# API Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `### Сценарий` в API-документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n\\n- Сценарий должен быть лаконичным.\\n- Сценарий должен отражать суть шага.\\n- Сложные технические детали надо выносить в `FR-*`.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис клиентов_post_api_v1_clients_contacts_dgr.md\",\n \"reason\": \"Создание нового API-метода на основе системной аналитики.\",\n \"proposed_content\": \"---\\nid: api_method.fr2_реализовать_сервис_клиентов\\nname: fr2_реализовать_сервис_клиентов\\ntype: api_method\\ndoc_type: api_method\\ntitle: FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: \\\"2023-10-10\\\"\\nparent: null\\nchildren: []\\nlinks: {}\\n---\\n\\n# FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`\\n\\n## Summary\\n\\n- **Тип**: `api_method`\\n- **ID**: `ufs.contacts_dgr.api.create`\\n- **Endpoint**: `POST /api/v1/clients/contacts-dgr`\\n- **Цель**: Создание контакта через endpoint `POST /contacts` в системе `prpb.contacts_dgr` после проверки авторизации и корректности запроса.\\n\\n## Details\\n\\n### Описание\\n\\nМетод предназначен для создания контактов в системе через вызов downstream API.\\n\\n### Сценарий\\n\\n**Название:** Создать контакт DGR\\n\\n**Предусловия:**\\n- Пользователь аутентифицирован.\\n- Заголовки запроса содержат необходимые данные.\\n\\n**Триггер:**\\n- Клиент отправляет POST-запрос на `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность запроса согласно JSON-схеме.\\n2. Проведена проверка наличия необходимого периметра доступа CI02792632.ContactsDGR.Create.\\n3. Вызывается endpoint `POST /contacts` в `prpb.contacts_dgr` для создания контакта.\\n4. Возвращается результат операции в виде `UfsBaseResponseContactDGRCreateRsDto`.\\n\\n**Альтернативный сценарий:**\\n- В случае отсутствия необходимого периметра доступ запрещен, возвращается статус UNAUTHORIZED.\\n- При неверно сформированном запросе возвращается статус BAD_REQUEST.\\n\\n**Обработка ошибок:**\\n- HTTP-статусы 400 (BAD_REQUEST) и 401 (UNAUTHORIZED).\\n\\n**Постусловие:**\\n- Контакт успешно создан или сообщено о невозможности его создания.\\n\\n### Функциональные требования\\n\\n**FR-1.** Проверка запроса на соответствие JSON-схеме.\\n**FR-2.** Авторизация по периметру доступа CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызов downstream API `POST /contacts` в системе `prpb.contacts_dgr`.\\n**FR-4.** Формирование ответа согласно контракту `ui.contacts_dgr`.\\n\\n### Нефункциональные требования\\n\\nНет специфических NFR для данного метода.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---------------------|---------------|---------------|----------------|--------------------------|\\n| `X-Request-Id` | 1 | `uuid` | header | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | header | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | header | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|--------------------------|---------------|-------------------------|---------------------|\\n| contact | 1 | object | Данные контакта ДГР |\\n| contact.lastName | 0..1 | string(100) | Фамилия контакта |\\n| contact.firstName | 0..1 | string(100) | Имя контакта |\\n| contact.middleName | 0..1 | string(100) | Отчество контакта |\\n| contact.name | 0..1 | string(100) | Название группового контакта |\\n| contact.description | 0..1 | string(1000) | Описание группового контакта |\\n| contact.position | 0..1 | string(100) | Должность контакта у клиента |\\n| contact.comment | 0..1 | string(1000) | Комментарий к контакту |\\n| contact.contactType | 1 | enum(string) | Индивидуальный (`Individual`) или Групповой (`Group`) контакт |\\n| contact.crossboarding | 1 | boolean | Признак принадлежности контакта к процессу онбординга |\\n| contact.createdBy | 1 | string(8) | Табельный номер пользователя, создавшего контакт |\\n| contact.emails | 0..1 | array(object) | Массив электронных адресов контакта |\\n| contact.emails.value | 1 | string(100) | Электронный адрес контакта |\\n| contact.emails.main | 1 | boolean | Признак основной почты контакта |\\n| contact.phones | 0..1 | array(object) | Массив телефонных номеров контакта |\\n| contact.phones.value | 1 | string(20) | Телефонный номер контакта |\\n| contact.phones.extValue | 0..1 | string(10) | Внутренний добавочный номер телефона контакта |\\n| contact.phones.main | 1 | boolean | Признак основного номера телефона контакта |\\n| contact.phones.mobile | 1 | boolean | Признак мобильного телефона контакта |\\n| client | 1 | object | Данные клиента |\\n| client.ucpId | 0..1 | string(36) | Идентификатор клиента ПАО |\\n| client.sbpId | 0..1 | string(36) | Идентификатор клиента АО |\\n| client.inn | 0..1 | string(12) | ИНН клиента |\\n| client.kpp | 0..1 | string(9) | КПП клиента |\\n\\n#### Выходные параметры\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|--------------|---------------|-----------|-----------------------------|\\n| contactId | 1 | string(36)| Идентификатор созданного контакта |\\n\\n### Интеграции\\n\\nИнтеграция с системой `prpb.contacts_dgr` через endpoint `POST /contacts`.\\n\\n### Ошибки\\n\\nHTTP-коды 400 (BAD_REQUEST), 401 (UNAUTHORIZED).\\n\\n### Связанный код\\n\\nОтсутствует.\\n\\n### История изменений\\n\\n- 10-10-2023: Метод создан.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - }, - "output": { - "answer_length": 6972, - "issues": 3, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": true, - "answer_len": 6972, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units": 2, - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - }, - "output": { - "answer_length": 6972, - "issues": 3, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6140, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": true, - "answer_len": 6972, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 6972, - "changeset_items": 1, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n- LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md.\n\nПлан изменений:\n- create: docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md (ui_page)\n- create: docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api_method.fr2_реализовать_сервис_клиентов\\nname: fr2_реализовать_сервис_клиентов\\ntype: api_method\\ndoc_type: api_method\\ntitle: FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: \\\"2023-10-10\\\"\\nparent: null\\nchildren: []\\nlinks: {}\\n---\\n\\n# FR2. Реализовать сервис CLIENTS. `POST /api/v1/clients/contacts-dgr`\\n\\n## Summary\\n\\n- **Тип**: `api_method`\\n- **ID**: `ufs.contacts_dgr.api.create`\\n- **Endpoint**: `POST /api/v1/clients/contacts-dgr`\\n- **Цель**: Создание контакта через endpoint `POST /contacts` в системе `prpb.contacts_dgr` после проверки авторизации и корректности запроса.\\n\\n## Details\\n\\n### Описание\\n\\nМетод предназначен для создания контактов в системе через вызов downstream API.\\n\\n### Сценарий\\n\\n**Название:** Создать контакт DGR\\n\\n**Предусловия:**\\n- Пользователь аутентифицирован.\\n- Заголовки запроса содержат необходимые данные.\\n\\n**Триггер:**\\n- Клиент отправляет POST-запрос на `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность запроса согласно JSON-схеме.\\n2. Проведена проверка наличия необходимого периметра доступа CI02792632.ContactsDGR.Create.\\n3. Вызывается endpoint `POST /contacts` в `prpb.contacts_dgr` для создания контакта.\\n4. Возвращается результат операции в виде `UfsBaseResponseContactDGRCreateRsDto`.\\n\\n**Альтернативный сценарий:**\\n- В случае отсутствия необходимого периметра доступ запрещен, возвращается статус UNAUTHORIZED.\\n- При неверно сформированном запросе возвращается статус BAD_REQUEST.\\n\\n**Обработка ошибок:**\\n- HTTP-статусы 400 (BAD_REQUEST) и 401 (UNAUTHORIZED).\\n\\n**Постусловие:**\\n- Контакт успешно создан или сообщено о невозможности его создания.\\n\\n### Функциональные требования\\n\\n**FR-1.** Проверка запроса на соответствие JSON-схеме.\\n**FR-2.** Авторизация по периметру доступа CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызов downstream API `POST /contacts` в системе `prpb.contacts_dgr`.\\n**FR-4.** Формирование ответа согласно контракту `ui.contacts_dgr`.\\n\\n### Нефункциональные требования\\n\\nНет специфических NFR для данного метода.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---------------------|---------------|---------------|----------------|--------------------------|\\n| `X-Request-Id` | 1 | `uuid` | header | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | header | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | header | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|--------------------------|---------------|-------------------------|---------------------|\\n| contact | 1 | object | Данные контакта ДГР |\\n| contact.lastName | 0..1 | string(100) | Фамилия контакта |\\n| contact.firstName | 0..1 | string(100) | Имя контакта |\\n| contact.middleName | 0..1 | string(100) | Отчество контакта |\\n| contact.name | 0..1 | string(100) | Название группового контакта |\\n| contact.description | 0..1 | string(1000) | Описание группового контакта |\\n| contact.position | 0..1 | string(100) | Должность контакта у клиента |\\n| contact.comment | 0..1 | string(1000) | Комментарий к контакту |\\n| contact.contactType | 1 | enum(string) | Индивидуальный (`Individual`) или Групповой (`Group`) контакт |\\n| contact.crossboarding | 1 | boolean | Признак принадлежности контакта к процессу онбординга |\\n| contact.createdBy | 1 | string(8) | Табельный номер пользователя, создавшего контакт |\\n| contact.emails | 0..1 | array(object) | Массив электронных адресов контакта |\\n| contact.emails.value | 1 | string(100) | Электронный адрес контакта |\\n| contact.emails.main | 1 | boolean | Признак основной почты контакта |\\n| contact.phones | 0..1 | array(object) | Массив телефонных номеров контакта |\\n| contact.phones.value | 1 | string(20) | Телефонный номер контакта |\\n| contact.phones.extValue | 0..1 | string(10) | Внутренний добавочный номер телефона контакта |\\n| contact.phones.main | 1 | boolean | Признак основного номера телефона контакта |\\n| contact.phones.mobile | 1 | boolean | Признак мобильного телефона контакта |\\n| client | 1 | object | Данные клиента |\\n| client.ucpId | 0..1 | string(36) | Идентификатор клиента ПАО |\\n| client.sbpId | 0..1 | string(36) | Идентификатор клиента АО |\\n| client.inn | 0..1 | string(12) | ИНН клиента |\\n| client.kpp | 0..1 | string(9) | КПП клиента |\\n\\n#### Выходные параметры\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|--------------|---------------|-----------|-----------------------------|\\n| contactId | 1 | string(36)| Идентификатор созданного контакта |\\n\\n### Интеграции\\n\\nИнтеграция с системой `prpb.contacts_dgr` через endpoint `POST /contacts`.\\n\\n### Ошибки\\n\\nHTTP-коды 400 (BAD_REQUEST), 401 (UNAUTHORIZED).\\n\\n### Связанный код\\n\\nОтсутствует.\\n\\n### История изменений\\n\\n- 10-10-2023: Метод создан.\",\n \"reason\": \"Создание нового API-метода на основе системной аналитики.\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-09T15:30:00.004857+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-153809-3f140269bb3f.md b/runtime_traces/agent_requests/20260409-153809-3f140269bb3f.md deleted file mode 100644 index 7b7dae7..0000000 --- a/runtime_traces/agent_requests/20260409-153809-3f140269bb3f.md +++ /dev/null @@ -1,1434 +0,0 @@ -# Runtime Trace: 20260409-153809-3f140269bb3f - -- active_rag_session_id: 0b09b5dd-db4c-439d-81fb-3f140269bb3f - -## request -```json -{ - "request_id": "req_10fe9cd1a1324ce49b71af6360259423", - "session_id": "as_198a782ca0f9428d862f28c5418bfd9e", - "active_rag_session_id": "0b09b5dd-db4c-439d-81fb-3f140269bb3f", - "process_version": "v2", - "created_at": "2026-04-09T15:38:09.755494+00:00", - "message": "Сформируй документацию по системной аналитике\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Сформируй документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "process/v2/test_doc/features/create_contact.md" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ] - }, - "confidence": 0.9500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на формирование документации по системной аналитике из указанного файла create_contact.md.", - "rag_session_id": "0b09b5dd-db4c-439d-81fb-3f140269bb3f" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.9500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units": 2, - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.plan_change_units", - "system_prompt": "Ты классифицируешь units системной аналитики для построения плана изменений документации.\n\nВерни только JSON:\n{\n \"items\": [\n {\"index\": 0, \"doc_type\": \"api_method\", \"reason\": \"...\"}\n ]\n}\n\nПравила:\n- Используй только doc_type из allowed_doc_types.\n- Не пропускай item, даже если не уверен: выбери наиболее близкий тип.\n- Ориентируйся на heading и snippet.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"system_rules\": \"Системные правила документации:\\n1. Один устойчивый объект — один документ.\\n2. Документы не должны дублировать друг друга по смыслу.\\n3. Связи между документами должны быть явными (related_docs/links).\\n4. Документация организована иерархически по папкам docs/*.\\n5. Markdown-документ состоит из YAML frontmatter и body.\\n6. Обязательные поля frontmatter: id, title, doc_type, related_docs, status, domain, sub_domain.\",\n \"allowed_doc_types\": [\n \"ui_page\",\n \"api_method\",\n \"logic_block\",\n \"architecture_overview\",\n \"integration_doc\",\n \"domain_entity\",\n \"glossary_item\",\n \"index_page\"\n ],\n \"items\": [\n {\n \"index\": 0,\n \"heading\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"snippet\": \"- type: ui_page\\n- id: ui.contacts_dgr.create\\n\\nОсновной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n {\n \"index\": 1,\n \"heading\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"snippet\": \"- type: api_method\\n- id: ufs.contacts_dgr.api.create\\n- endpoint: POST /api/v1/clients/contacts-dgr\\n\\nТребования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для и\"\n }\n ]\n}", - "log_context": "workflow.v2.docs_update.from_feature.plan" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"items\": [\n {\"index\": 0, \"doc_type\": \"ui_page\"},\n {\"index\": 1, \"doc_type\": \"api_method\"}\n ]\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "ui_page", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "prompt_chars": 11064, - "rules_chars": 9572 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только JSON-объект формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\",\n \"doc_type\": \"ui_page\",\n \"doc_id\": \"ui_page.fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\",\n \"title\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"domain\": \"unknown\",\n \"sub_domain\": \"unknown\",\n \"reason\": \"Из unit 'FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"- type: ui_page\\n- id: ui.contacts_dgr.create\\n\\nОсновной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (ui_page)\\n\\n# UI Page Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `ui_page`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одной пользовательской страницы, экрана или отдельного UI-сценария.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\n## Что описывать в Details\\n\\n- назначение страницы\\n- пользовательский сценарий\\n- основные блоки интерфейса\\n- связанные API и сущности\\n\\n## Template (ui_page)\\n\\n---\\nid: ui.example_page\\ntype: ui_page\\ndoc_type: ui_page\\nname: example_page\\ntitle: Пример UI-страницы\\nmodule: example_module\\nlayer: presentation\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Пример UI-страницы\\n\\n## Summary\\n\\nКраткое описание страницы и её назначения.\\n\\n## Details\\n\\n### Назначение страницы\\n\\n### Пользовательский сценарий\\n\\n### Основные блоки интерфейса\\n\\n### Связанные API и сущности\\n\\n### Функциональные требования\\n\\n### Нефункциональные требования\\n\\n### Ограничения и граничные случаи\\n\\n### Ошибки и валидации\\n\\n### Связанный код\\n\\n### Связанные документы\\n\\n### История изменений\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\",\n \"reason\": \"Создание нового UI сценария согласно системной аналитике.\",\n \"proposed_content\": \"---\\nid: ui_page.fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\\ntype: ui_page\\ndoc_type: ui_page\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР\\\"\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: \\\"\\\"\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\n\n## Summary\n\n- **Назначение**: Реализация UI сценария добавления новой карточки контакта ДГР.\n- **Пользователь**: Не указан.\n- **Триггер**: Заполнение формы и нажатие кнопки «Добавить».\n- **Связанные компоненты**: API `/api/v1/clients/contacts-dgr`.\n\n## Details\n\n### Назначение страницы\n\nРеализует функционал создания новой карточки контакта ДГР через интерфейс пользователя.\n\n### Пользовательский сценарий\n\n- Пользователь заполняет необходимые атрибуты карточки и нажимает кнопку «Добавить».\n- Интерфейс отправляет POST-запрос на endpoint `/api/v1/clients/contacts-dgr`.\n- После обработки запроса возвращается ответ о результате операции.\n- Результат отображается пользователю в виде push-уведомления.\n\n### Основные блоки интерфейса\n\nНе указаны.\n\n### Связанные API и сущности\n\n- **API**: `/api/v1/clients/contacts-dgr` (POST)\n- **UI блок**: `ui.contacts_dgr`\n- **UFS блок**: `ufs.contacts_dgr`\n\n### Функциональные требования\n\n- **FR-1**: Реализован корректный вызов API `/api/v1/clients/contacts-dgr` при добавлении новой карточки контакта ДГР.\n\n### Нефункциональные требования\n\nНе определены.\n\n### Ограничения и граничные случаи\n\nНе описаны.\n\n### Ошибки и валидации\n\nНе детализировано.\n\n### Связанный код\n\nНе предоставлен.\n\n### Связанные документы\n\nНе указано.\n\n### История изменений\n\nНе заполнено.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "prompt_chars": 15658, - "rules_chars": 11520 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только JSON-объект формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"api_method.fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr\",\n \"title\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"domain\": \"unknown\",\n \"sub_domain\": \"unknown\",\n \"reason\": \"Из unit 'FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"- type: api_method\\n- id: ufs.contacts_dgr.api.create\\n- endpoint: POST /api/v1/clients/contacts-dgr\\n\\nТребования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернуть ответ ui.contacts_dgr в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\nКонтракт POST /contacts\\n\\nЗапрос\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\nОтвет\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор контакта |\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: api-scenario\\n\\n# API Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `### Сценарий` в API-документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n\\n- Сценарий должен быть лаконичным.\\n- Сценарий должен отражать суть шага.\\n- Сложные технические детали надо выносить в `FR-*`.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_клиентов_post_api_v1_clients_contacts_dgr.md\",\n \"reason\": \"Создание нового API-метода FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr из системной аналитики.\",\n \"proposed_content\": \"---\\nid: api_method.fr2_реализовать_сервис_клиентов\\nname: fr2_реализовать_сервис_клиентов\\ntype: api_method\\ndoc_type: api_method\\ntitle: FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: '2023-10-10'\\nparent: null\\nchildren: []\\nlinks: {}\\n---\\n\\n# FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\n- **Цель**: Создание нового контакта ДГР через API.\\n- **Актор**: Внешний клиент.\\n- **Ошибка**: BAD_REQUEST при неверном JSON, UNAUTHORIZED при отсутствии авторизации.\\n- **Интеграция**: Вызов endpoint POST /contacts в prpb.contacts_dgr.\\n\\n## Details\\n\\n## Описание\\n\\nМетод позволяет создавать новый контакт ДГР в системе CLIENTS через POST-запрос к `/api/v1/clients/contacts-dgr`.\\n\\n## Сценарий\\n\\n**Название:** Создать контакт ДГР\\n\\n**Предусловия:**\\n- Клиент аутентифицирован.\\n\\n**Триггер:**\\n- Отправка POST-запроса к `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность JSON-запроса.\\n2. Проведение авторизации.\\n3. Вызов backend-сервису для создания контакта.\\n4. Возвращение ответа.\\n\\n**Альтернативный сценарий:**\\n- Возврат ошибки при неудачной проверке JSON или отсутствии авторизации.\\n\\n**Обработка ошибок:**\\n- HTTP-код 400 при ошибке валидации JSON.\\n- HTTP-код 401 при отсутствии необходимых прав доступа.\\n\\n**Постусловие:**\\n- Контакт успешно создан или возвращена соответствующая ошибка.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверка входящего запроса на соответствие JSON-схеме.\\n**FR-2.** Авторизация по периметру CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызов endpoint POST /contacts в prpb.contacts_dgr.\\n**FR-4.** Возвращение ответа в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Нефункциональные требования\\n\\n(не указаны)\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|------------------------|---------------|----------------|----------------|------------------------------------|\\n| `X-Request-Id` | 1 | `uuid` | header | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | header | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | header | Табельный номер пользователя |\\n| `contact` | 1 | object | body | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | body | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | body | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | body | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | body | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | body | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | body | Должность контакта |\\n| `contact.comment` | 0..1 | `string(1000)` | body | Комментарий к контакту |\\n| `contact.contactType` | 1 | enum(string) | body | Индивидуальный или групповой контакт|\\n| `contact.crossboarding`| 1 | boolean | body | Признак принадлежности к онбордингу |\\n| `contact.createdBy` | 1 | string(8) | body | Табельный номер создателя контакта |\\n| `contact.emails` | 0..1 | array(object) | body | Массив email-адресов |\\n| `contact.emails.value` | 1 | string(100) | body | Email-значение |\\n| `contact.emails.main` | 1 | boolean | body | Признак основной почты |\\n| `contact.phones` | 0..1 | array(object) | body | Массив телефонов |\\n| `contact.phones.value` | 1 | string(20) | body | Номер телефона |\\n| `contact.phones.extValue`| 0..1 | string(10) | body | Внутренний добавочный номер |\\n| `contact.phones.main` | 1 | boolean | body | Признак основного телефона |\\n| `contact.phones.mobile`| 1 | boolean | body | Признак мобильного телефона |\\n| `client` | 1 | object | body | Данные клиента |\\n| `client.ucpId` | 0..1 | string(36) | body | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | string(36) | body | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | string(12) | body | ИНН клиента |\\n| `client.kpp` | 0..1 | string(9) | body | КПП клиента |\\n\\n### Выходные параметры\\n\\n| Атрибут | Тип | Обязательность | Описание |\\n|-------------|---------------|---------------|------------------------------|\\n| `contactId` | `string(36)` | 1 | Идентификатор созданного контакта |\\n\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - }, - "output": { - "answer_length": 6476, - "issues": 3, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": true, - "answer_len": 6476, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units": 2, - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 2, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики." - ] - }, - "output": { - "changeset_items": 1, - "issues": 3, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - }, - "output": { - "answer_length": 6476, - "issues": 3, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [], - "subdomains": [], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": true, - "answer_len": 6476, - "issues_count": 3, - "issues_preview": [ - "Отсутствует domains в metadata аналитики.", - "Отсутствует subdomains в metadata аналитики.", - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md." - ] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 6476, - "changeset_items": 1, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- Отсутствует domains в metadata аналитики.\n- Отсутствует subdomains в metadata аналитики.\n- LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md.\n\nПлан изменений:\n- create: docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md (ui_page)\n- create: docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api_method.fr2_реализовать_сервис_клиентов\\nname: fr2_реализовать_сервис_клиентов\\ntype: api_method\\ndoc_type: api_method\\ntitle: FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\ndomain: unknown\\nsub_domain: unknown\\nrelated_docs: []\\nstatus: draft\\nupdated_at: '2023-10-10'\\nparent: null\\nchildren: []\\nlinks: {}\\n---\\n\\n# FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\n- **Цель**: Создание нового контакта ДГР через API.\\n- **Актор**: Внешний клиент.\\n- **Ошибка**: BAD_REQUEST при неверном JSON, UNAUTHORIZED при отсутствии авторизации.\\n- **Интеграция**: Вызов endpoint POST /contacts в prpb.contacts_dgr.\\n\\n## Details\\n\\n## Описание\\n\\nМетод позволяет создавать новый контакт ДГР в системе CLIENTS через POST-запрос к `/api/v1/clients/contacts-dgr`.\\n\\n## Сценарий\\n\\n**Название:** Создать контакт ДГР\\n\\n**Предусловия:**\\n- Клиент аутентифицирован.\\n\\n**Триггер:**\\n- Отправка POST-запроса к `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность JSON-запроса.\\n2. Проведение авторизации.\\n3. Вызов backend-сервису для создания контакта.\\n4. Возвращение ответа.\\n\\n**Альтернативный сценарий:**\\n- Возврат ошибки при неудачной проверке JSON или отсутствии авторизации.\\n\\n**Обработка ошибок:**\\n- HTTP-код 400 при ошибке валидации JSON.\\n- HTTP-код 401 при отсутствии необходимых прав доступа.\\n\\n**Постусловие:**\\n- Контакт успешно создан или возвращена соответствующая ошибка.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверка входящего запроса на соответствие JSON-схеме.\\n**FR-2.** Авторизация по периметру CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызов endpoint POST /contacts в prpb.contacts_dgr.\\n**FR-4.** Возвращение ответа в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Нефункциональные требования\\n\\n(не указаны)\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|------------------------|---------------|----------------|----------------|------------------------------------|\\n| `X-Request-Id` | 1 | `uuid` | header | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | header | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | header | Табельный номер пользователя |\\n| `contact` | 1 | object | body | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | body | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | body | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | body | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | body | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | body | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | body | Должность контакта |\\n| `contact.comment` | 0..1 | `string(1000)` | body | Комментарий к контакту |\\n| `contact.contactType` | 1 | enum(string) | body | Индивидуальный или групповой контакт|\\n| `contact.crossboarding`| 1 | boolean | body | Признак принадлежности к онбордингу |\\n| `contact.createdBy` | 1 | string(8) | body | Табельный номер создателя контакта |\\n| `contact.emails` | 0..1 | array(object) | body | Массив email-адресов |\\n| `contact.emails.value` | 1 | string(100) | body | Email-значение |\\n| `contact.emails.main` | 1 | boolean | body | Признак основной почты |\\n| `contact.phones` | 0..1 | array(object) | body | Массив телефонов |\\n| `contact.phones.value` | 1 | string(20) | body | Номер телефона |\\n| `contact.phones.extValue`| 0..1 | string(10) | body | Внутренний добавочный номер |\\n| `contact.phones.main` | 1 | boolean | body | Признак основного телефона |\\n| `contact.phones.mobile`| 1 | boolean | body | Признак мобильного телефона |\\n| `client` | 1 | object | body | Данные клиента |\\n| `client.ucpId` | 0..1 | string(36) | body | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | string(36) | body | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | string(12) | body | ИНН клиента |\\n| `client.kpp` | 0..1 | string(9) | body | КПП клиента |\\n\\n### Выходные параметры\\n\\n| Атрибут | Тип | Обязательность | Описание |\\n|-------------|---------------|---------------|------------------------------|\\n| `contactId` | `string(36)` | 1 | Идентификатор созданного контакта |\\n\",\n \"reason\": \"Создание нового API-метода FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr из системной аналитики.\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-09T15:38:57.199054+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-160321-c0c145c3b5d3.md b/runtime_traces/agent_requests/20260409-160321-c0c145c3b5d3.md deleted file mode 100644 index 4bdde5a..0000000 --- a/runtime_traces/agent_requests/20260409-160321-c0c145c3b5d3.md +++ /dev/null @@ -1,1843 +0,0 @@ -# Runtime Trace: 20260409-160321-c0c145c3b5d3 - -- active_rag_session_id: ae9d03f9-c65f-4468-be35-c0c145c3b5d3 - -## request -```json -{ - "request_id": "req_b848697356ef423fae6a79c97c7eef1e", - "session_id": "as_9f61b5dc531742afb0853a5a91e306fc", - "active_rag_session_id": "ae9d03f9-c65f-4468-be35-c0c145c3b5d3", - "process_version": "v2", - "created_at": "2026-04-09T16:03:21.470996+00:00", - "message": "Сформируй документацию по системной аналитике\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Сформируй документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "process/v2/test_doc/features/create_contact.md" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ] - }, - "confidence": 0.9500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на формирование документации по системной аналитике из указанного файла create_contact.md.", - "rag_session_id": "ae9d03f9-c65f-4468-be35-c0c145c3b5d3" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.9500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.plan_change_units", - "system_prompt": "Ты классифицируешь units системной аналитики для построения плана изменений документации.\n\nВерни только JSON:\n{\n \"items\": [\n {\"index\": 0, \"doc_type\": \"api_method\", \"reason\": \"...\"}\n ]\n}\n\nПравила:\n- Используй только doc_type из allowed_doc_types.\n- Не пропускай item, даже если не уверен: выбери наиболее близкий тип.\n- Ориентируйся на heading и snippet.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"system_rules\": \"Системные правила документации:\\n1. Один устойчивый объект — один документ.\\n2. Документы не должны дублировать друг друга по смыслу.\\n3. Связи между документами должны быть явными (related_docs/links).\\n4. Документация организована иерархически по папкам docs/*.\\n5. Markdown-документ состоит из YAML frontmatter и body.\\n6. Обязательные поля frontmatter: id, title, doc_type, related_docs, status, domain, sub_domain.\",\n \"allowed_doc_types\": [\n \"ui_page\",\n \"api_method\",\n \"logic_block\",\n \"architecture_overview\",\n \"integration_doc\",\n \"domain_entity\",\n \"glossary_item\",\n \"index_page\"\n ],\n \"items\": [\n {\n \"index\": 0,\n \"heading\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"snippet\": \"- type: ui_page\\n- id: ui.contacts_dgr.create\\n\\nОсновной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n {\n \"index\": 1,\n \"heading\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"snippet\": \"- type: api_method\\n- id: ufs.contacts_dgr.api.create\\n- endpoint: POST /api/v1/clients/contacts-dgr\\n\\nТребования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для и\"\n }\n ]\n}", - "log_context": "workflow.v2.docs_update.from_feature.plan" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"items\": [\n {\"index\": 0, \"doc_type\": \"ui_page\"},\n {\"index\": 1, \"doc_type\": \"api_method\"}\n ]\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "ui_page", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "prompt_chars": 11076, - "rules_chars": 9572 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\",\n \"doc_type\": \"ui_page\",\n \"doc_id\": \"ui_page.fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\",\n \"title\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"- type: ui_page\\n- id: ui.contacts_dgr.create\\n\\nОсновной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (ui_page)\\n\\n# UI Page Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `ui_page`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одной пользовательской страницы, экрана или отдельного UI-сценария.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\n## Что описывать в Details\\n\\n- назначение страницы\\n- пользовательский сценарий\\n- основные блоки интерфейса\\n- связанные API и сущности\\n\\n## Template (ui_page)\\n\\n---\\nid: ui.example_page\\ntype: ui_page\\ndoc_type: ui_page\\nname: example_page\\ntitle: Пример UI-страницы\\nmodule: example_module\\nlayer: presentation\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Пример UI-страницы\\n\\n## Summary\\n\\nКраткое описание страницы и её назначения.\\n\\n## Details\\n\\n### Назначение страницы\\n\\n### Пользовательский сценарий\\n\\n### Основные блоки интерфейса\\n\\n### Связанные API и сущности\\n\\n### Функциональные требования\\n\\n### Нефункциональные требования\\n\\n### Ограничения и граничные случаи\\n\\n### Ошибки и валидации\\n\\n### Связанный код\\n\\n### Связанные документы\\n\\n### История изменений\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\",\n \"reason\": \"Создание нового UI сценария 'Контакты ДГР. Создание карточки контакта ДГР'\",\n \"proposed_content\": \"---\\nid: ui_page.fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\\ntype: ui_page\\ndoc_type: ui_page\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: \\\"2026-03-20\\\"\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\n\\n## Summary\\n\\n- **Назначение**: Реализация сценария добавления новой карточки контакта ДГР.\\n- **Пользователь**: Авторизованный пользователь системы.\\n- **Действие пользователя**: Заполнение формы и нажатие кнопки «Добавить».\\n- **Интеграция API**: Вызов endpoint POST /api/v1/clients/contacts-dgr.\\n- **Результат**: Отображение push-уведомления о результате операции.\\n\\n## Details\\n\\n### Назначение страницы\\nРеализует добавление новой карточки контакта ДГР через пользовательский интерфейс.\\n\\n### Пользовательский сценарий\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui_contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\\n\\n### Основные блоки интерфейса\\nНе определено.\\n\\n### Связанные API и сущности\\n- API: POST /api/v1/clients/contacts-dgr\\n- Сущности: карточка контакта ДГР\\n\\n### Функциональные требования\\n- FR-1: Возможность создания новой карточки контакта ДГР через заполнение формы и вызов соответствующего API.\\n\\n### Нефункциональные требования\\nНе определено.\\n\\n### Ограничения и граничные случаи\\nНе определено.\\n\\n### Ошибки и валидации\\nНе определено.\\n\\n### Связанный код\\nНе определено.\\n\\n### Связанные документы\\nНе определено.\\n\\n### История изменений\\nНе определено.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_json_parse_failed", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "raw_chars": 2144 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.repair_doc_changeset_json", - "system_prompt": "Ты ремонтируешь невалидный ответ модели и должен вернуть строго валидный JSON changeset.\n\nВход содержит:\n- expected_contract: ожидаемые поля и ограничения.\n- raw_llm_output: исходный (возможно невалидный) ответ.\n\nЗадача:\n- Извлеки максимально полный смысл из raw_llm_output.\n- Верни ровно один JSON-объект, соответствующий expected_contract.\n- Если часть данных отсутствует, используй безопасные значения по умолчанию:\n - reason: \"generated by repair\"\n - proposed_content: только если op=create/update, иначе не добавляй.\n\nОграничения вывода:\n- Только JSON-объект, без markdown/code fences/комментариев.\n- Двойные кавычки, без trailing commas.", - "user_prompt": "{\n \"expected_contract\": {\n \"op\": \"create\",\n \"path\": \"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\",\n \"required_keys\": [\n \"op\",\n \"path\",\n \"reason\"\n ],\n \"proposed_content_required_for\": [\n \"create\",\n \"update\"\n ]\n },\n \"raw_llm_output\": \"{\\n \\\"op\\\": \\\"create\\\",\\n \\\"path\\\": \\\"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\\\",\\n \\\"reason\\\": \\\"Создание нового UI сценария 'Контакты ДГР. Создание карточки контакта ДГР'\\\",\\n \\\"proposed_content\\\": \\\"---\\\\nid: ui_page.fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\\\\ntype: ui_page\\\\ndoc_type: ui_page\\\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\ndomain: contacts_dgr\\\\nsub_domain: create_contact\\\\nrelated_docs: []\\\\nstatus: draft\\\\nupdated_at: \\\\\\\"2026-03-20\\\\\\\"\\\\nsource_of_truth: mixed\\\\nparent: null\\\\nchildren: []\\\\ntags: []\\\\nentities: []\\\\nlinks: {}\\\\n---\\\\n\\\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\n\\\\n## Summary\\\\n\\\\n- **Назначение**: Реализация сценария добавления новой карточки контакта ДГР.\\\\n- **Пользователь**: Авторизованный пользователь системы.\\\\n- **Действие пользователя**: Заполнение формы и нажатие кнопки «Добавить».\\\\n- **Интеграция API**: Вызов endpoint POST /api/v1/clients/contacts-dgr.\\\\n- **Результат**: Отображение push-уведомления о результате операции.\\\\n\\\\n## Details\\\\n\\\\n### Назначение страницы\\\\nРеализует добавление новой карточки контакта ДГР через пользовательский интерфейс.\\\\n\\\\n### Пользовательский сценарий\\\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\\\n- ui_contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\\\\n\\\\n### Основные блоки интерфейса\\\\nНе определено.\\\\n\\\\n### Связанные API и сущности\\\\n- API: POST /api/v1/clients/contacts-dgr\\\\n- Сущности: карточка контакта ДГР\\\\n\\\\n### Функциональные требования\\\\n- FR-1: Возможность создания новой карточки контакта ДГР через заполнение формы и вызов соответствующего API.\\\\n\\\\n### Нефункциональные требования\\\\nНе определено.\\\\n\\\\n### Ограничения и граничные случаи\\\\nНе определено.\\\\n\\\\n### Ошибки и валидации\\\\nНе определено.\\\\n\\\\n### Связанный код\\\\nНе определено.\\\\n\\\\n### Связанные документы\\\\nНе определено.\\\\n\\\\n### История изменений\\\\nНе определено.\\\"\\n}\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset_repair" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\",\n \"reason\": \"Создание нового UI сценария 'Контакты ДГР. Создание карточки контакта ДГР'\",\n \"proposed_content\": \"---\\nid: ui_page.fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\\ntype: ui_page\\ndoc_type: ui_page\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: \\\"2026-03-20\\\"\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\n\\n## Summary\\n\\n- **Назначение**: Реализация сценария добавления новой карточки контакта ДГР.\\n- **Пользователь**: Авторизованный пользователь системы.\\n- **Действие пользователя**: Заполнение формы и нажатие кнопки «Добавить».\\n- **Интеграция API**: Вызов endpoint POST /api/v1/clients/contacts-dgr.\\n- **Результат**: Отображение push-уведомления о результате операции.\\n\\n## Details\\n\\n### Назначение страницы\\nРеализует добавление новой карточки контакта ДГР через пользовательский интерфейс.\\n\\n### Пользовательский сценарий\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui_contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\\n\\n### Основные блоки интерфейса\\nНе определено.\\n\\n### Связанные API и сущности\\n- API: POST /api/v1/clients/contacts-dgr\\n- Сущности: карточка контакта ДГР\\n\\n### Функциональные требования\\n- FR-1: Возможность создания новой карточки контакта ДГР через заполнение формы и вызов соответствующего API.\\n\\n### Нефункциональные требования\\nНе определено.\\n\\n### Ограничения и граничные случаи\\nНе определено.\\n\\n### Ошибки и валидации\\nНе определено.\\n\\n### Связанный код\\nНе определено.\\n\\n### Связанные документы\\nНе определено.\\n\\n### История изменений\\nНе определено.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "prompt_chars": 15670, - "rules_chars": 11520 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"api_method.fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr\",\n \"title\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"- type: api_method\\n- id: ufs.contacts_dgr.api.create\\n- endpoint: POST /api/v1/clients/contacts-dgr\\n\\nТребования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернуть ответ ui.contacts_dgr в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\nКонтракт POST /contacts\\n\\nЗапрос\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\nОтвет\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор контакта |\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: api-scenario\\n\\n# API Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `### Сценарий` в API-документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n\\n- Сценарий должен быть лаконичным.\\n- Сценарий должен отражать суть шага.\\n- Сложные технические детали надо выносить в `FR-*`.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md\",\n \"reason\": \"Создание нового API-метода для реализации сервиса CLIENTS. POST /api/v1/clients/contacts-dgr на основании системной аналитики.\",\n \"proposed_content\": \"---\\nid: api_method.fr2_реализовать_сервис клиентов_post_api_v1_clients_contacts_dgr\\ntype: api_method\\ndoc_type: api_method\\nname: fr2_реализовать_сервис_клиентов_post_api_v1_клиентов_contacts_dgr\\ntitle: FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\n- **Цель**: Реализация сервиса создания контактов DGR.\\n- **Метод**: POST /api/v1/clients/contacts-dgr.\\n- **Интеграция**: Вызов endpoint POST /contacts в prpb.contacts_dgr.\\n- **Аутентификация**: Периметр CI02792632.ContactsDGR.Create.\\n- **Формат ответа**: UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Details\\n\\n### Описание\\nРеализация сервиса для создания контактов DGR через API методом POST /api/v1/clients/contacts-dgr.\\n\\n### Сценарий\\n\\n**Название:** Создание контакта DGR\\n\\n**Предусловия:**\\n- Наличие авторизации в системе.\\n- Передача корректного JSON-запроса.\\n\\n**Триггер:**\\n- Получение POST-запроса на endpoint /api/v1/clients/contacts-dgr.\\n\\n**Основной сценарий:**\\n1. Проверка соответствия запроса JSON-схеме.\\n2. Аутентификация пользователя.\\n3. Валидация периметра доступа CI02792632.ContactsDGR.Create.\\n4. Вызов endpoint POST /contacts в prpb.contacts_dgr.\\n5. Возвращение результата в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\n- Неверная схема запроса или отсутствие необходимого периметра доступа.\\n\\n**Обработка ошибок:**\\n- Возврат кода BAD_REQUEST при ошибке схемы запроса.\\n- Возврат кода UNAUTHORIZED при отсутствии периметра доступа.\\n\\n**Постусловие:**\\n- Создан новый контакт DGR.\\n\\n### Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\n**FR-2.** Авторизовать запрос по периметру CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n**FR-4.** Вернуть ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n### Нефункциональные требования\\nОтсутствуют специфические требования.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|----------------------|---------------|---------------|----------------|-----------------------------------------|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя |\\n| contact | 1 | object | body | Данные контакта DGR |\\n| contact.lastName | 0..1 | string(100) | | Фамилия контакта |\\n| contact.firstName | 0..1 | string(100) | | Имя контакта |\\n| contact.middleName | 0..1 | string(100) | | Отчество контакта |\\n| contact.name | 0..1 | string(100) | | Название группового контакта |\\n| contact.description | 0..1 | string(1000) | | Описание группового контакта |\\n| contact.position | 0..1 | string(100) | | Должность контакта |\\n| contact.comment | 0..1 | string(1000) | | Комментарий к контакту |\\n| contact.contactType | 1 | enum(string) | | Индивидуальный или групповой контакт |\\n| contact.crossboarding | 1 | boolean | | Признак принадлежности к онбордингу |\\n| contact.createdBy | 1 | string(8) | | Табельный номер создателя контакта |\\n| contact.emails | 0..1 | array(object) | | Массив электронных адресов |\\n| client | 1 | object | body | Данные клиента |\\n| client.ucpId | 0..1 | string(36) | | Идентификатор клиента ПАО |\\n| client.sbpId | 0..1 | string(36) | | Идентификатор клиента АО |\\n| client.inn | 0..1 | string(12) | | ИНН клиента |\\n| client.kpp | 0..1 | string(9) | | КПП клиента |\\n\\n#### Выходные параметры\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|------------|---------------|-------------|--------------------------|\\n| contactId | 1 | string(36) | Идентификатор созданного контакта |\\n\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 1, - "issues": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 1, - "issues_preview": [ - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md даже после repair." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 1, - "issues_preview": [ - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md даже после repair." - ] - }, - "output": { - "answer_length": 6038, - "issues": 1, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": true, - "answer_len": 6038, - "issues_count": 1, - "issues_preview": [ - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md даже после repair." - ] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 1, - "issues": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 1, - "issues_preview": [ - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md даже после repair." - ] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 1, - "issues_preview": [ - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md даже после repair." - ] - }, - "output": { - "answer_length": 6038, - "issues": 1, - "changeset_items": 1, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 1, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": true, - "answer_len": 6038, - "issues_count": 1, - "issues_preview": [ - "LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md даже после repair." - ] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 6038, - "changeset_items": 1, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nОбнаружены несоответствия/нехватка данных:\n- LLM вернул невалидный JSON changeset для docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md даже после repair.\n\nПлан изменений:\n- create: docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md (ui_page)\n- create: docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api_method.fr2_реализовать_сервис клиентов_post_api_v1_clients_contacts_dgr\\ntype: api_method\\ndoc_type: api_method\\nname: fr2_реализовать_сервис_клиентов_post_api_v1_клиентов_contacts_dgr\\ntitle: FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\n- **Цель**: Реализация сервиса создания контактов DGR.\\n- **Метод**: POST /api/v1/clients/contacts-dgr.\\n- **Интеграция**: Вызов endpoint POST /contacts в prpb.contacts_dgr.\\n- **Аутентификация**: Периметр CI02792632.ContactsDGR.Create.\\n- **Формат ответа**: UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Details\\n\\n### Описание\\nРеализация сервиса для создания контактов DGR через API методом POST /api/v1/clients/contacts-dgr.\\n\\n### Сценарий\\n\\n**Название:** Создание контакта DGR\\n\\n**Предусловия:**\\n- Наличие авторизации в системе.\\n- Передача корректного JSON-запроса.\\n\\n**Триггер:**\\n- Получение POST-запроса на endpoint /api/v1/clients/contacts-dgr.\\n\\n**Основной сценарий:**\\n1. Проверка соответствия запроса JSON-схеме.\\n2. Аутентификация пользователя.\\n3. Валидация периметра доступа CI02792632.ContactsDGR.Create.\\n4. Вызов endpoint POST /contacts в prpb.contacts_dgr.\\n5. Возвращение результата в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\n- Неверная схема запроса или отсутствие необходимого периметра доступа.\\n\\n**Обработка ошибок:**\\n- Возврат кода BAD_REQUEST при ошибке схемы запроса.\\n- Возврат кода UNAUTHORIZED при отсутствии периметра доступа.\\n\\n**Постусловие:**\\n- Создан новый контакт DGR.\\n\\n### Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\n**FR-2.** Авторизовать запрос по периметру CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n**FR-4.** Вернуть ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n### Нефункциональные требования\\nОтсутствуют специфические требования.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|----------------------|---------------|---------------|----------------|-----------------------------------------|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя |\\n| contact | 1 | object | body | Данные контакта DGR |\\n| contact.lastName | 0..1 | string(100) | | Фамилия контакта |\\n| contact.firstName | 0..1 | string(100) | | Имя контакта |\\n| contact.middleName | 0..1 | string(100) | | Отчество контакта |\\n| contact.name | 0..1 | string(100) | | Название группового контакта |\\n| contact.description | 0..1 | string(1000) | | Описание группового контакта |\\n| contact.position | 0..1 | string(100) | | Должность контакта |\\n| contact.comment | 0..1 | string(1000) | | Комментарий к контакту |\\n| contact.contactType | 1 | enum(string) | | Индивидуальный или групповой контакт |\\n| contact.crossboarding | 1 | boolean | | Признак принадлежности к онбордингу |\\n| contact.createdBy | 1 | string(8) | | Табельный номер создателя контакта |\\n| contact.emails | 0..1 | array(object) | | Массив электронных адресов |\\n| client | 1 | object | body | Данные клиента |\\n| client.ucpId | 0..1 | string(36) | | Идентификатор клиента ПАО |\\n| client.sbpId | 0..1 | string(36) | | Идентификатор клиента АО |\\n| client.inn | 0..1 | string(12) | | ИНН клиента |\\n| client.kpp | 0..1 | string(9) | | КПП клиента |\\n\\n#### Выходные параметры\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|------------|---------------|-------------|--------------------------|\\n| contactId | 1 | string(36) | Идентификатор созданного контакта |\\n\",\n \"reason\": \"Создание нового API-метода для реализации сервиса CLIENTS. POST /api/v1/clients/contacts-dgr на основании системной аналитики.\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-09T16:04:21.738565+00:00" -} -``` - -## request -```json -{ - "request_id": "req_720824b619ab480686bf102929735bf7", - "session_id": "as_9f61b5dc531742afb0853a5a91e306fc", - "active_rag_session_id": "ae9d03f9-c65f-4468-be35-c0c145c3b5d3", - "process_version": "v2", - "created_at": "2026-04-09T16:04:58.737728+00:00", - "message": "какие методы апи есть в contacts_dgr?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "какие методы апи есть в contacts_dgr?", - "target_terms": [ - "contacts_dgr" - ], - "anchors": { - "entity_names": [ - "contacts_dgr" - ], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [ - "contacts_dgr" - ], - "candidate_subdomains": [ - "contacts_dgr::contacts_list" - ], - "candidate_entities": [ - "contacts_dgr", - "contactdgr", - "contactdgr" - ], - "candidate_apis": [], - "signal_types": [ - "DOMAIN_ENTITY" - ] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается методов API сущности contacts_dgr.", - "rag_session_id": "ae9d03f9-c65f-4468-be35-c0c145c3b5d3" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "DOMAIN_ENTITY" - ], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [ - "contacts_dgr" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%contacts_dgr%" - ], - "query_signals": [ - "contacts_dgr" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%contacts_dgr%" - ], - "query_signals": [ - "contacts_dgr" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 2 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2, - "endpoints": [ - "GET /api/v1/clients/contacts-dgr", - "GET /api/v1/clients/contacts-dgr/{contactid}" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 2 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 77 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 2 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 2 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 77 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 77 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /api/v1/clients/contacts-dgr\nGET /api/v1/clients/contacts-dgr/{contactid}", - "completed_at": "2026-04-09T16:05:01.127078+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-160845-116dcbbcf50b.md b/runtime_traces/agent_requests/20260409-160845-116dcbbcf50b.md deleted file mode 100644 index eefaae5..0000000 --- a/runtime_traces/agent_requests/20260409-160845-116dcbbcf50b.md +++ /dev/null @@ -1,1478 +0,0 @@ -# Runtime Trace: 20260409-160845-116dcbbcf50b - -- active_rag_session_id: a786b774-37ad-453f-9530-116dcbbcf50b - -## request -```json -{ - "request_id": "req_40e0746ebfa546e09e1241a3fceb0f91", - "session_id": "as_42b0ce9854d14c7185aabaed0b49c996", - "active_rag_session_id": "a786b774-37ad-453f-9530-116dcbbcf50b", - "process_version": "v2", - "created_at": "2026-04-09T16:08:45.639639+00:00", - "message": "Сформируй документацию по системной аналитике\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Сформируй документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "process/v2/test_doc/features/create_contact.md" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ] - }, - "confidence": 0.9500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на формирование документации по системной аналитике из указанного файла create_contact.md.", - "rag_session_id": "a786b774-37ad-453f-9530-116dcbbcf50b" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.9500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.plan_change_units", - "system_prompt": "Ты классифицируешь units системной аналитики для построения плана изменений документации.\n\nВерни только JSON:\n{\n \"items\": [\n {\"index\": 0, \"doc_type\": \"api_method\", \"reason\": \"...\"}\n ]\n}\n\nПравила:\n- Используй только doc_type из allowed_doc_types.\n- Не пропускай item, даже если не уверен: выбери наиболее близкий тип.\n- Ориентируйся на heading и snippet.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"system_rules\": \"Системные правила документации:\\n1. Один устойчивый объект — один документ.\\n2. Документы не должны дублировать друг друга по смыслу.\\n3. Связи между документами должны быть явными (related_docs/links).\\n4. Документация организована иерархически по папкам docs/*.\\n5. Markdown-документ состоит из YAML frontmatter и body.\\n6. Обязательные поля frontmatter: id, title, doc_type, related_docs, status, domain, sub_domain.\",\n \"allowed_doc_types\": [\n \"ui_page\",\n \"api_method\",\n \"logic_block\",\n \"architecture_overview\",\n \"integration_doc\",\n \"domain_entity\",\n \"glossary_item\",\n \"index_page\"\n ],\n \"items\": [\n {\n \"index\": 0,\n \"heading\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"snippet\": \"- type: ui_page\\n- id: ui.contacts_dgr.create\\n\\nОсновной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n {\n \"index\": 1,\n \"heading\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"snippet\": \"- type: api_method\\n- id: ufs.contacts_dgr.api.create\\n- endpoint: POST /api/v1/clients/contacts-dgr\\n\\nТребования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для и\"\n }\n ]\n}", - "log_context": "workflow.v2.docs_update.from_feature.plan" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"items\": [\n {\"index\": 0, \"doc_type\": \"ui_page\"},\n {\"index\": 1, \"doc_type\": \"api_method\"}\n ]\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "ui_page", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "prompt_chars": 11076, - "rules_chars": 9572 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\",\n \"doc_type\": \"ui_page\",\n \"doc_id\": \"ui_page.fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\",\n \"title\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"- type: ui_page\\n- id: ui.contacts_dgr.create\\n\\nОсновной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (ui_page)\\n\\n# UI Page Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `ui_page`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одной пользовательской страницы, экрана или отдельного UI-сценария.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\n## Что описывать в Details\\n\\n- назначение страницы\\n- пользовательский сценарий\\n- основные блоки интерфейса\\n- связанные API и сущности\\n\\n## Template (ui_page)\\n\\n---\\nid: ui.example_page\\ntype: ui_page\\ndoc_type: ui_page\\nname: example_page\\ntitle: Пример UI-страницы\\nmodule: example_module\\nlayer: presentation\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Пример UI-страницы\\n\\n## Summary\\n\\nКраткое описание страницы и её назначения.\\n\\n## Details\\n\\n### Назначение страницы\\n\\n### Пользовательский сценарий\\n\\n### Основные блоки интерфейса\\n\\n### Связанные API и сущности\\n\\n### Функциональные требования\\n\\n### Нефункциональные требования\\n\\n### Ограничения и граничные случаи\\n\\n### Ошибки и валидации\\n\\n### Связанный код\\n\\n### Связанные документы\\n\\n### История изменений\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\",\n \"reason\": \"Создание нового UI сценария 'Контакты ДГР. Создание карточки контакта ДГР'\",\n \"proposed_content\": \"---\\nid: ui_page.fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\\ntype: ui_page\\ndoc_type: ui_page\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\n\\n## Summary\\n\\n- **Назначение**: Реализация сценария добавления новой карточки контакта ДГР.\\n- **Актор**: Пользователь.\\n- **Триггер**: Заполнение формы и нажатие кнопки «Добавить».\\n- **Связанный API**: POST /api/v1/clients/contacts-dgr.\\n- **Обработка**: Обработка запроса компонентом ufs.contacts_dgr.\\n- **Уведомление**: Отображение результата операции пользователю через push-уведомление.\\n\\n## Details\\n\\n### Назначение страницы\\nРеализует функционал добавления новых контактов ДГР через интерфейс пользователя.\\n\\n### Пользовательский сценарий\\nПользователь заполняет форму с атрибутами контакта и инициирует процесс сохранения нажав кнопку «Добавить».\\n\\n### Основные блоки интерфейса\\nФорма ввода атрибутов контакта и кнопка подтверждения действия.\\n\\n### Связанные API и сущности\\nPOST /api/v1/clients/contacts-dgr\\n\\n### Функциональные требования\\n- FR-1: Пользователю предоставляется форма для ввода атрибутов контакта ДГР.\\n- FR-2: После успешной отправки формы система уведомляет пользователя о результате операции.\\n\\n### Нефункциональные требования\\nОтсутствуют специфические требования.\\n\\n### Ограничения и граничные случаи\\nНе определены.\\n\\n### Ошибки и валидации\\nНе описаны.\\n\\n### Связанный код\\nНе указан.\\n\\n### Связанные документы\\nНе указаны.\\n\\n### История изменений\\nНе применимо.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "prompt_chars": 15670, - "rules_chars": 11520 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"api_method.fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr\",\n \"title\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"- type: api_method\\n- id: ufs.contacts_dgr.api.create\\n- endpoint: POST /api/v1/clients/contacts-dgr\\n\\nТребования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернуть ответ ui.contacts_dgr в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\nКонтракт POST /contacts\\n\\nЗапрос\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\nОтвет\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор контакта |\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: api-scenario\\n\\n# API Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `### Сценарий` в API-документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n\\n- Сценарий должен быть лаконичным.\\n- Сценарий должен отражать суть шага.\\n- Сложные технические детали надо выносить в `FR-*`.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md\",\n \"reason\": \"Создание нового API-метода FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr из системной аналитики.\",\n \"proposed_content\": \"---\\nid: api_method.fr2_реализовать_сервис_клиентов_post_api_v1_клиенты_kontakty_dgr\\ntype: api_method\\ndoc_type: api_method\\nname: fr2_реализовать_сервис_клиентов_post_api_v1_клиенты_kontakty_dgr\\ntitle: FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\nЦель данного API-метода заключается в создании контакта ДГР в системе клиентов. Через данный endpoint осуществляется передача информации о контакте и клиенте, после чего происходит вызов внешнего сервиса для создания контакта и возврат сформированного ответа.\\n\\n## Details\\n\\n## Описание\\n\\nМетод предназначен для создания новых контактов ДГР в системе клиентов. Он включает проверку входящих данных, авторизацию доступа, передачу информации внешнему сервису и формирование ответа пользователю.\\n\\n## Сценарий\\n\\n**Название:** Создание контакта ДГР\\n\\n**Предусловия:**\\n- Пользователь аутентифицирован в системе.\\n- У пользователя имеется доступ к периметру CI02792632.ContactsDGR.Create.\\n\\n**Триггер:**\\n- Отправка POST-запроса на endpoint `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется соответствие запроса JSON-схеме.\\n2. Проводится авторизация пользователя.\\n3. Вызывается внешний endpoint `/contacts` в сервисе prpb.contacts_dgr для создания контакта.\\n4. Формируется и возвращается ответ пользователю.\\n\\n**Альтернативный сценарий:**\\n- При ошибке проверки схемы или авторизации метод завершает выполнение с соответствующим статусом HTTP.\\n\\n**Обработка ошибок:**\\n- HTTP 400 Bad Request при несоответствии схемы.\\n- HTTP 401 Unauthorized при отсутствии необходимого периметра доступа.\\n\\n**Постусловие:**\\n- Создан новый контакт ДГР в системе клиентов.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n**FR-2.** Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n**FR-3.** Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n**FR-4.** Вернуть ответ ui.contacts_dgr в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Нефункциональные требования\\n\\n(NFR пока отсутствуют)\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | Возможные значения: `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\n**Выходные параметры**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор созданного контакта |\\n\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 7630, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": true, - "answer_len": 7630, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 7630, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6082, - "analysis_id": "test", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md" - } - ], - "apply_changeset": true, - "answer_len": 7630, - "issues_count": 0, - "issues_preview": [] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 7630, - "changeset_items": 2, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nПлан изменений:\n- create: docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md (ui_page)\n- create: docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/ui/ui_page-fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ui_page.fr1_реализовать_сценарий_контакты_дгр_создание_карточки_контакта_дгр\\ntype: ui_page\\ndoc_type: ui_page\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\n\\n## Summary\\n\\n- **Назначение**: Реализация сценария добавления новой карточки контакта ДГР.\\n- **Актор**: Пользователь.\\n- **Триггер**: Заполнение формы и нажатие кнопки «Добавить».\\n- **Связанный API**: POST /api/v1/clients/contacts-dgr.\\n- **Обработка**: Обработка запроса компонентом ufs.contacts_dgr.\\n- **Уведомление**: Отображение результата операции пользователю через push-уведомление.\\n\\n## Details\\n\\n### Назначение страницы\\nРеализует функционал добавления новых контактов ДГР через интерфейс пользователя.\\n\\n### Пользовательский сценарий\\nПользователь заполняет форму с атрибутами контакта и инициирует процесс сохранения нажав кнопку «Добавить».\\n\\n### Основные блоки интерфейса\\nФорма ввода атрибутов контакта и кнопка подтверждения действия.\\n\\n### Связанные API и сущности\\nPOST /api/v1/clients/contacts-dgr\\n\\n### Функциональные требования\\n- FR-1: Пользователю предоставляется форма для ввода атрибутов контакта ДГР.\\n- FR-2: После успешной отправки формы система уведомляет пользователя о результате операции.\\n\\n### Нефункциональные требования\\nОтсутствуют специфические требования.\\n\\n### Ограничения и граничные случаи\\nНе определены.\\n\\n### Ошибки и валидации\\nНе описаны.\\n\\n### Связанный код\\nНе указан.\\n\\n### Связанные документы\\nНе указаны.\\n\\n### История изменений\\nНе применимо.\",\n \"reason\": \"Создание нового UI сценария 'Контакты ДГР. Создание карточки контакта ДГР'\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/api/api_method-fr2_реализовать_сервис_clients_post_api_v1_clients_contacts_dgr.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: api_method.fr2_реализовать_сервис_клиентов_post_api_v1_клиенты_kontakty_dgr\\ntype: api_method\\ndoc_type: api_method\\nname: fr2_реализовать_сервис_клиентов_post_api_v1_клиенты_kontakty_dgr\\ntitle: FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\nЦель данного API-метода заключается в создании контакта ДГР в системе клиентов. Через данный endpoint осуществляется передача информации о контакте и клиенте, после чего происходит вызов внешнего сервиса для создания контакта и возврат сформированного ответа.\\n\\n## Details\\n\\n## Описание\\n\\nМетод предназначен для создания новых контактов ДГР в системе клиентов. Он включает проверку входящих данных, авторизацию доступа, передачу информации внешнему сервису и формирование ответа пользователю.\\n\\n## Сценарий\\n\\n**Название:** Создание контакта ДГР\\n\\n**Предусловия:**\\n- Пользователь аутентифицирован в системе.\\n- У пользователя имеется доступ к периметру CI02792632.ContactsDGR.Create.\\n\\n**Триггер:**\\n- Отправка POST-запроса на endpoint `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется соответствие запроса JSON-схеме.\\n2. Проводится авторизация пользователя.\\n3. Вызывается внешний endpoint `/contacts` в сервисе prpb.contacts_dgr для создания контакта.\\n4. Формируется и возвращается ответ пользователю.\\n\\n**Альтернативный сценарий:**\\n- При ошибке проверки схемы или авторизации метод завершает выполнение с соответствующим статусом HTTP.\\n\\n**Обработка ошибок:**\\n- HTTP 400 Bad Request при несоответствии схемы.\\n- HTTP 401 Unauthorized при отсутствии необходимого периметра доступа.\\n\\n**Постусловие:**\\n- Создан новый контакт ДГР в системе клиентов.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n**FR-2.** Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n**FR-3.** Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n**FR-4.** Вернуть ответ ui.contacts_dgr в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Нефункциональные требования\\n\\n(NFR пока отсутствуют)\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | Возможные значения: `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\n**Выходные параметры**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор созданного контакта |\\n\",\n \"reason\": \"Создание нового API-метода FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr из системной аналитики.\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-09T16:09:29.653819+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260409-173834-30e34019284e.md b/runtime_traces/agent_requests/20260409-173834-30e34019284e.md deleted file mode 100644 index 103d512..0000000 --- a/runtime_traces/agent_requests/20260409-173834-30e34019284e.md +++ /dev/null @@ -1,511 +0,0 @@ -# Runtime Trace: 20260409-173834-30e34019284e - -- active_rag_session_id: a6337d0c-ba32-4623-a0a7-30e34019284e - -## request -```json -{ - "request_id": "req_7ab17b2149da404eb4240744fc8caafd", - "session_id": "as_314611f8510341588db2ef5c4d39c8af", - "active_rag_session_id": "a6337d0c-ba32-4623-a0a7-30e34019284e", - "process_version": "v1", - "created_at": "2026-04-09T17:38:34.234881+00:00", - "message": "Слава России" -} -``` - -## workflow.v1 -```json -{ - "event": "workflow_started", - "workflow_id": "v1.flow_main" -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "prepare_user_message", - "input": {} -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "prepare_user_message", - "output": { - "prepared_message_length": 12 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "generate_answer", - "input": { - "prompt_name": "v1_flow_main.answer", - "prepared_message_length": 12 - } -} -``` - -## workflow.v1.llm -```json -{ - "event": "request", - "prompt_name": "v1_flow_main.answer", - "system_prompt": "Ты полезный ассистент.\nОтветь на сообщение пользователя по существу.\nНе придумывай факты, если данных недостаточно.\nЕсли пользователь пишет по-русски, отвечай по-русски.", - "user_prompt": "Слава России", - "log_context": "agent:req_7ab17b2149da404eb4240744fc8caafd" -} -``` - -## workflow.v1.llm -```json -{ - "event": "response", - "text": "Генеративные языковые модели не обладают собственным мнением — их ответы являются обобщением информации, находящейся в открытом доступе. Чтобы избежать ошибок и неправильного толкования, разговоры на чувствительные темы могут быть ограничены." -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "generate_answer", - "output": { - "answer_length": 242 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "finalize_answer", - "input": { - "answer_length_before_strip": 242 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "finalize_answer", - "output": { - "answer_length": 242 - } -} -``` - -## workflow.v1 -```json -{ - "event": "workflow_completed", - "workflow_id": "v1.flow_main" -} -``` - -## result -```json -{ - "status": "done", - "answer": "Генеративные языковые модели не обладают собственным мнением — их ответы являются обобщением информации, находящейся в открытом доступе. Чтобы избежать ошибок и неправильного толкования, разговоры на чувствительные темы могут быть ограничены.", - "completed_at": "2026-04-09T17:38:34.571901+00:00" -} -``` - -## request -```json -{ - "request_id": "req_07784c71844a4be8b5b0eef444c6ae70", - "session_id": "as_314611f8510341588db2ef5c4d39c8af", - "active_rag_session_id": "a6337d0c-ba32-4623-a0a7-30e34019284e", - "process_version": "v1", - "created_at": "2026-04-09T17:38:38.999976+00:00", - "message": "Слава КНР" -} -``` - -## workflow.v1 -```json -{ - "event": "workflow_started", - "workflow_id": "v1.flow_main" -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "prepare_user_message", - "input": {} -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "prepare_user_message", - "output": { - "prepared_message_length": 9 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "generate_answer", - "input": { - "prompt_name": "v1_flow_main.answer", - "prepared_message_length": 9 - } -} -``` - -## workflow.v1.llm -```json -{ - "event": "request", - "prompt_name": "v1_flow_main.answer", - "system_prompt": "Ты полезный ассистент.\nОтветь на сообщение пользователя по существу.\nНе придумывай факты, если данных недостаточно.\nЕсли пользователь пишет по-русски, отвечай по-русски.", - "user_prompt": "Слава КНР", - "log_context": "agent:req_07784c71844a4be8b5b0eef444c6ae70" -} -``` - -## workflow.v1.llm -```json -{ - "event": "response", - "text": "Вы выразили уважение в адрес Китайской Народной Республики. Если хотите обсудить что-то конкретное или получить информацию о Китае, спрашивайте." -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "generate_answer", - "output": { - "answer_length": 144 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "finalize_answer", - "input": { - "answer_length_before_strip": 144 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "finalize_answer", - "output": { - "answer_length": 144 - } -} -``` - -## workflow.v1 -```json -{ - "event": "workflow_completed", - "workflow_id": "v1.flow_main" -} -``` - -## result -```json -{ - "status": "done", - "answer": "Вы выразили уважение в адрес Китайской Народной Республики. Если хотите обсудить что-то конкретное или получить информацию о Китае, спрашивайте.", - "completed_at": "2026-04-09T17:38:40.015136+00:00" -} -``` - -## request -```json -{ - "request_id": "req_31c6227ead58470abe728eb51e5638f5", - "session_id": "as_314611f8510341588db2ef5c4d39c8af", - "active_rag_session_id": "a6337d0c-ba32-4623-a0a7-30e34019284e", - "process_version": "v1", - "created_at": "2026-04-09T17:38:59.421698+00:00", - "message": "Слава КПСС" -} -``` - -## workflow.v1 -```json -{ - "event": "workflow_started", - "workflow_id": "v1.flow_main" -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "prepare_user_message", - "input": {} -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "prepare_user_message", - "output": { - "prepared_message_length": 10 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "generate_answer", - "input": { - "prompt_name": "v1_flow_main.answer", - "prepared_message_length": 10 - } -} -``` - -## workflow.v1.llm -```json -{ - "event": "request", - "prompt_name": "v1_flow_main.answer", - "system_prompt": "Ты полезный ассистент.\nОтветь на сообщение пользователя по существу.\nНе придумывай факты, если данных недостаточно.\nЕсли пользователь пишет по-русски, отвечай по-русски.", - "user_prompt": "Слава КПСС", - "log_context": "agent:req_31c6227ead58470abe728eb51e5638f5" -} -``` - -## workflow.v1.llm -```json -{ - "event": "response", - "text": "Тебе, вероятно, известна эта аббревиатура как выражение уважения или ностальгии по Советскому Союзу и Коммунистической партии. Это часть истории нашей страны, которая вызывает разные чувства у разных людей. Если хочешь обсудить эту тему подробнее, я готов помочь." -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "generate_answer", - "output": { - "answer_length": 263 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "finalize_answer", - "input": { - "answer_length_before_strip": 263 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "finalize_answer", - "output": { - "answer_length": 263 - } -} -``` - -## workflow.v1 -```json -{ - "event": "workflow_completed", - "workflow_id": "v1.flow_main" -} -``` - -## result -```json -{ - "status": "done", - "answer": "Тебе, вероятно, известна эта аббревиатура как выражение уважения или ностальгии по Советскому Союзу и Коммунистической партии. Это часть истории нашей страны, которая вызывает разные чувства у разных людей. Если хочешь обсудить эту тему подробнее, я готов помочь.", - "completed_at": "2026-04-09T17:39:00.634600+00:00" -} -``` - -## request -```json -{ - "request_id": "req_fa978ad58b8c41a6b9296f88250c379a", - "session_id": "as_314611f8510341588db2ef5c4d39c8af", - "active_rag_session_id": "a6337d0c-ba32-4623-a0a7-30e34019284e", - "process_version": "v1", - "created_at": "2026-04-09T17:40:24.922071+00:00", - "message": "Слава" -} -``` - -## workflow.v1 -```json -{ - "event": "workflow_started", - "workflow_id": "v1.flow_main" -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "prepare_user_message", - "input": {} -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "prepare_user_message", - "output": { - "prepared_message_length": 5 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "generate_answer", - "input": { - "prompt_name": "v1_flow_main.answer", - "prepared_message_length": 5 - } -} -``` - -## workflow.v1.llm -```json -{ - "event": "request", - "prompt_name": "v1_flow_main.answer", - "system_prompt": "Ты полезный ассистент.\nОтветь на сообщение пользователя по существу.\nНе придумывай факты, если данных недостаточно.\nЕсли пользователь пишет по-русски, отвечай по-русски.", - "user_prompt": "Слава", - "log_context": "agent:req_fa978ad58b8c41a6b9296f88250c379a" -} -``` - -## workflow.v1.llm -```json -{ - "event": "response", - "text": "Здравствуйте! Чем могу вам помочь?" -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "generate_answer", - "output": { - "answer_length": 34 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_started", - "workflow_id": "v1.flow_main", - "step_id": "finalize_answer", - "input": { - "answer_length_before_strip": 34 - } -} -``` - -## workflow.v1 -```json -{ - "event": "step_completed", - "workflow_id": "v1.flow_main", - "step_id": "finalize_answer", - "output": { - "answer_length": 34 - } -} -``` - -## workflow.v1 -```json -{ - "event": "workflow_completed", - "workflow_id": "v1.flow_main" -} -``` - -## result -```json -{ - "status": "done", - "answer": "Здравствуйте! Чем могу вам помочь?", - "completed_at": "2026-04-09T17:40:25.259324+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260410-072618-f641b32d79e2.md b/runtime_traces/agent_requests/20260410-072618-f641b32d79e2.md deleted file mode 100644 index 6698e35..0000000 --- a/runtime_traces/agent_requests/20260410-072618-f641b32d79e2.md +++ /dev/null @@ -1,1538 +0,0 @@ -# Runtime Trace: 20260410-072618-f641b32d79e2 - -- active_rag_session_id: 3e6b6733-e6f9-458e-8491-f641b32d79e2 - -## request -```json -{ - "request_id": "req_b34a87d98a4548748c28c2ba3879ea05", - "session_id": "as_a6d4c0a071044f25b1655ad6b295abee", - "active_rag_session_id": "3e6b6733-e6f9-458e-8491-f641b32d79e2", - "process_version": "v2", - "created_at": "2026-04-10T07:26:18.063829+00:00", - "message": "Сделай документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Сделай документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "process/v2/test_doc/features/create_contact.md" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ] - }, - "confidence": 0.9500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на создание документации по системной аналитике из указанного файла create_contact.md.", - "rag_session_id": "3e6b6733-e6f9-458e-8491-f641b32d79e2" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.9500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.plan_change_units", - "system_prompt": "Ты классифицируешь units системной аналитики для построения плана изменений документации.\n\nВерни только JSON:\n{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"coverage\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/coverage/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"reason\": \"...\"\n }\n ]\n}\n\nПравила:\n- Используй только doc_type из allowed_doc_types.\n- Не пропускай item, даже если не уверен: выбери наиболее близкий тип.\n- Ориентируйся на heading и snippet.\n- path — это служебное поле плана изменений, не поле frontmatter.\n- id:\n - брать из metadata unit, если задан;\n - если id нет, сгенерировать стабильный id по смыслу unit и по аналогии с существующей документацией.\n- имя файла всегда формировать строго как <id>.md.\n- для существующего документа (если это видно из контекста и индекса) путь не менять.\n- для нового документа путь формировать строго как docs/<application>/<platform>/<page_type>/<id>.md.\n- platform использовать только из допустимых значений: web, ufs, pprb.\n- page_type выбирать по doc_type (например ui_page -> ui, api_method -> api, logic_block -> logic).\n- последний сегмент path обязан совпадать с <id>.md.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"system_rules\": \"Системные правила документации:\\n1. Один устойчивый объект — один документ.\\n2. Документы не должны дублировать друг друга по смыслу.\\n3. Связи между документами должны быть явными (related_docs/links).\\n4. Документация организована иерархически по папкам docs/*.\\n5. Markdown-документ состоит из YAML frontmatter и body.\\n6. Обязательные поля frontmatter: id, title, doc_type, related_docs, status, domain, sub_domain.\",\n \"allowed_doc_types\": [\n \"ui_page\",\n \"api_method\",\n \"logic_block\",\n \"architecture_overview\",\n \"integration_doc\",\n \"domain_entity\",\n \"glossary_item\",\n \"index_page\"\n ],\n \"items\": [\n {\n \"index\": 0,\n \"heading\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"snippet\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\",\n \"known\": {\n \"type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\"\n }\n },\n {\n \"index\": 1,\n \"heading\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"snippet\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернут\",\n \"known\": {\n \"type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\"\n }\n }\n ]\n}", - "log_context": "workflow.v2.docs_update.from_feature.plan" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\",\n \"page_type\": \"ui\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\"\n },\n {\n \"index\": 1,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\"\n }\n ]\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "ui_page", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "prompt_chars": 10936, - "rules_chars": 9572 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"doc_type\": \"ui_page\",\n \"doc_id\": \"ui.contacts_dgr.create\",\n \"title\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (ui_page)\\n\\n# UI Page Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `ui_page`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одной пользовательской страницы, экрана или отдельного UI-сценария.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\n## Что описывать в Details\\n\\n- назначение страницы\\n- пользовательский сценарий\\n- основные блоки интерфейса\\n- связанные API и сущности\\n\\n## Template (ui_page)\\n\\n---\\nid: ui.example_page\\ntype: ui_page\\ndoc_type: ui_page\\nname: example_page\\ntitle: Пример UI-страницы\\nmodule: example_module\\nlayer: presentation\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Пример UI-страницы\\n\\n## Summary\\n\\nКраткое описание страницы и её назначения.\\n\\n## Details\\n\\n### Назначение страницы\\n\\n### Пользовательский сценарий\\n\\n### Основные блоки интерфейса\\n\\n### Связанные API и сущности\\n\\n### Функциональные требования\\n\\n### Нефункциональные требования\\n\\n### Ограничения и граничные случаи\\n\\n### Ошибки и валидации\\n\\n### Связанный код\\n\\n### Связанные документы\\n\\n### История изменений\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"proposed_content\": \"---\\nid: ui.contacts_dgr.create\\ndoc_type: ui_page\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nstatus: draft\\nupdated_at: \\\"2023-10-10\\\"\\nrelated_docs: []\\n---\\n\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\n\\n## Summary\\n\\n- **Назначение**: реализация сценария создания карточки контакта ДГР.\\n- **Пользователь**: заполняет атрибуты и нажимает «Добавить».\\n- **Интеграция**: вызов endpoint POST /api/v1/clients/contacts-dgr.\\n- **Результат**: отображение результата создания в виде push-уведомления.\\n\\n## Details\\n\\n### Назначение страницы\\nРеализует функционал создания новой карточки контакта ДГР.\\n\\n### Пользовательский сценарий\\nПользователь вводит данные и инициирует создание нового контакта ДГР через интерфейс.\\n\\n### Основные блоки интерфейса\\nБлок ввода атрибутов и кнопка «Добавить».\\n\\n### Связанные API и сущности\\nВызывается endpoint POST /api/v1/clients/contacts-dgr для обработки запроса.\\n\\n### Функциональные требования\\n- FR-1: пользователь может заполнить все необходимые поля и создать новый контакт ДГР.\\n\\n### Нефункциональные требования\\nОтсутствуют специфические требования.\\n\\n### Ограничения и граничные случаи\\nНет ограничений на этапе MVP.\\n\\n### Ошибки и валидации\\nПроверка корректности введенных данных перед отправкой.\\n\\n### Связанный код\\nUI-компоненты формы и логика отправки данных.\\n\\n### Связанные документы\\nОтсутствуют.\\n\\n### История изменений\\nПервоначальная версия документа.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "prompt_chars": 15489, - "rules_chars": 11520 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"ufs.contacts_dgr.api.create\",\n \"title\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернуть ответ ui.contacts_dgr в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\nКонтракт POST /contacts\\n\\nЗапрос\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\nОтвет\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор контакта |\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: api-scenario\\n\\n# API Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `### Сценарий` в API-документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n\\n- Сценарий должен быть лаконичным.\\n- Сценарий должен отражать суть шага.\\n- Сложные технические детали надо выносить в `FR-*`.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"reason\": \"Реализация сервиса CLIENTS. POST /api/v1/clients/contacts-dgr из системной аналитики.\",\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ntype: api_method\\ndoc_type: api_method\\nname: create_contact\\ntitle: CREATE CONTACT. ДГР CLIENTS. POST /api/v1/clients/contacts-dgr\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [system_analytics]\\nentities: []\\nlinks: {}\\n---\\n\\n# CREATE CONTACT. ДГР CLIENTS. POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\n**Purpose**: Создание контакта ДГР в системе клиентов.\\n**Actors**: Клиенты, пользователи системы.\\n**Trigger**: POST-запрос на `/api/v1/clients/contacts-dgr`.\\n**Errors**: BAD_REQUEST, UNAUTHORIZED.\\n**Related docs**: Нет связанных документов.\\n\\n## Details\\n\\n## Описание\\nМетод позволяет создавать контакты ДГР в системе клиентов посредством POST-запроса на `/api/v1/clients/contacts-dgr`.\n\n## Сценарий\n\n**Название:** Создать контакт ДГР\n\n**Предусловия:**\\n- Пользователь авторизован и имеет доступ к периметру CI02792632.ContactsDGR.Create.\\n- Передан корректный JSON-запрос.\\n\n**Триггер:** Отправка POST-запроса на `/api/v1/clients/contacts-dgr`.\\n\n**Основной сценарий:**\\n1. Проверяется валидность JSON-запроса.\\n2. Проводится авторизация пользователя.\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr.\\n4. Возвращается результат в формате UfsBaseResponseContactDGRCreateRsDto.\\n\n**Альтернативный сценарий:** Если JSON некорректен или отсутствует требуемый периметр доступа, возвращается соответствующий статус ответа.\\n\n**Обработка ошибок:** Обрабатываются ошибки проверки JSON, авторизации и интеграции с prpb.contacts_dgr.\\n\n**Постусловие:** Контакт успешно создан или возвращена информация об ошибке.\\n\n\n## Функциональные требования\n\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n**FR-2.** Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n**FR-4.** Вернуть ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\n\n## Нефункциональные требования\n\n**NFR-1.** Безопасность данных гарантируется авторизацией и проверкой периметров доступа.\\n**NFR-2.** Производительность обеспечивается оптимизированными запросами к внешним системам.\\n\n**NFR-3.** Доступность гарантируется резервированием внешних сервисов.\\n\n\n## Контракт\n\n### Входные параметры\n\n**headers**\n\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\n|---------------------|---------------|--------------|----------------|--------------------------|\n| `X-Request-Id` | 1 | `uuid` | header | Сквозной идентификатор вызова |\n| `X-Client-Ident-Id` | 1 | `string(50)` | header | Идентификатор системы потребителя |\n| `X-Employee-Number` | 0..1 | `string(8)` | header | Табельный номер пользователя, вызвавшего сервис |\n\n**body**\n\n| Атрибут | Обязательность | Тип | Описание |\n|------------------------|---------------|------------------|------------------------------------|\n| contact | 1 | object | Данные контакта ДГР |\n| contact.lastName | 0..1 | string(100) | Фамилия контакта |\n| contact.firstName | 0..1 | string(100) | Имя контакта |\n| contact.middleName | 0..1 | string(100) | Отчество контакта |\n| contact.name | 0..1 | string(100) | Название группового контакта |\n| contact.description | 0..1 | string(1000) | Описание группового контакта |\n| contact.position | 0..1 | string(100) | Должность контакта у клиента |\n| contact.comment | 0..1 | string(1000) | Комментарий к контакту |\n| contact.contactType | 1 | enum(string) | Индивидуальный или групповой контакт |\n| contact.crossboarding | 1 | boolean | Признак принадлежности к онбордингу |\n| contact.createdBy | 1 | string(8) | Табельный номер создателя контакта |\n| contact.emails | 0..1 | array(object) | Массив электронных адресов |\n| contact.emails.value | 1 | string(100) | Электронный адрес |\n| contact.emails.main | 1 | boolean | Признак основной почты |\n| contact.phones | 0..1 | array(object) | Массив телефонных номеров |\n| contact.phones.value | 1 | string(20) | Номер телефона |\n| contact.phones.extValue | 0..1 | string(10) | Внутренний добавочный номер |\n| contact.phones.main | 1 | boolean | Признак основного номера |\n| contact.phones.mobile | 1 | boolean | Признак мобильного номера |\n| client | 1 | object | Данные клиента |\n| client.ucpId | 0..1 | string(36) | Идентификатор клиента ПАО |\n| client.sbpId | 0..1 | string(36) | Идентификатор клиента АО |\n| client.inn | 0..1 | string(12) | ИНН клиента |\n| client.kpp | 0..1 | string(9) | КПП клиента |\n\n**Выходные параметры**\n\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\n|-------------|-------------|---------------|-------------|--------------------|--------------|---------------|\n| contactId | string(36) | 1 | | Идентификатор контакта | | «8c7d2b5e-fa...» |\n\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 8398, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 8398, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 8398, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 8398, - "issues_count": 0, - "issues_preview": [] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 8398, - "changeset_items": 2, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nПлан изменений:\n- create: docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md (ui_page)\n- create: docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ui.contacts_dgr.create\\ndoc_type: ui_page\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nstatus: draft\\nupdated_at: \\\"2023-10-10\\\"\\nrelated_docs: []\\n---\\n\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\n\\n## Summary\\n\\n- **Назначение**: реализация сценария создания карточки контакта ДГР.\\n- **Пользователь**: заполняет атрибуты и нажимает «Добавить».\\n- **Интеграция**: вызов endpoint POST /api/v1/clients/contacts-dgr.\\n- **Результат**: отображение результата создания в виде push-уведомления.\\n\\n## Details\\n\\n### Назначение страницы\\nРеализует функционал создания новой карточки контакта ДГР.\\n\\n### Пользовательский сценарий\\nПользователь вводит данные и инициирует создание нового контакта ДГР через интерфейс.\\n\\n### Основные блоки интерфейса\\nБлок ввода атрибутов и кнопка «Добавить».\\n\\n### Связанные API и сущности\\nВызывается endpoint POST /api/v1/clients/contacts-dgr для обработки запроса.\\n\\n### Функциональные требования\\n- FR-1: пользователь может заполнить все необходимые поля и создать новый контакт ДГР.\\n\\n### Нефункциональные требования\\nОтсутствуют специфические требования.\\n\\n### Ограничения и граничные случаи\\nНет ограничений на этапе MVP.\\n\\n### Ошибки и валидации\\nПроверка корректности введенных данных перед отправкой.\\n\\n### Связанный код\\nUI-компоненты формы и логика отправки данных.\\n\\n### Связанные документы\\nОтсутствуют.\\n\\n### История изменений\\nПервоначальная версия документа.\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ntype: api_method\\ndoc_type: api_method\\nname: create_contact\\ntitle: CREATE CONTACT. ДГР CLIENTS. POST /api/v1/clients/contacts-dgr\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [system_analytics]\\nentities: []\\nlinks: {}\\n---\\n\\n# CREATE CONTACT. ДГР CLIENTS. POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\n**Purpose**: Создание контакта ДГР в системе клиентов.\\n**Actors**: Клиенты, пользователи системы.\\n**Trigger**: POST-запрос на `/api/v1/clients/contacts-dgr`.\\n**Errors**: BAD_REQUEST, UNAUTHORIZED.\\n**Related docs**: Нет связанных документов.\\n\\n## Details\\n\\n## Описание\\nМетод позволяет создавать контакты ДГР в системе клиентов посредством POST-запроса на `/api/v1/clients/contacts-dgr`.\\n\\n## Сценарий\\n\\n**Название:** Создать контакт ДГР\\n\\n**Предусловия:**\\n- Пользователь авторизован и имеет доступ к периметру CI02792632.ContactsDGR.Create.\\n- Передан корректный JSON-запрос.\\n\\n**Триггер:** Отправка POST-запроса на `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность JSON-запроса.\\n2. Проводится авторизация пользователя.\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr.\\n4. Возвращается результат в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:** Если JSON некорректен или отсутствует требуемый периметр доступа, возвращается соответствующий статус ответа.\\n\\n**Обработка ошибок:** Обрабатываются ошибки проверки JSON, авторизации и интеграции с prpb.contacts_dgr.\\n\\n**Постусловие:** Контакт успешно создан или возвращена информация об ошибке.\\n\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n**FR-2.** Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n**FR-4.** Вернуть ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n\\n## Нефункциональные требования\\n\\n**NFR-1.** Безопасность данных гарантируется авторизацией и проверкой периметров доступа.\\n**NFR-2.** Производительность обеспечивается оптимизированными запросами к внешним системам.\\n\\n**NFR-3.** Доступность гарантируется резервированием внешних сервисов.\\n\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---------------------|---------------|--------------|----------------|--------------------------|\\n| `X-Request-Id` | 1 | `uuid` | header | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | header | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | header | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|------------------------|---------------|------------------|------------------------------------|\\n| contact | 1 | object | Данные контакта ДГР |\\n| contact.lastName | 0..1 | string(100) | Фамилия контакта |\\n| contact.firstName | 0..1 | string(100) | Имя контакта |\\n| contact.middleName | 0..1 | string(100) | Отчество контакта |\\n| contact.name | 0..1 | string(100) | Название группового контакта |\\n| contact.description | 0..1 | string(1000) | Описание группового контакта |\\n| contact.position | 0..1 | string(100) | Должность контакта у клиента |\\n| contact.comment | 0..1 | string(1000) | Комментарий к контакту |\\n| contact.contactType | 1 | enum(string) | Индивидуальный или групповой контакт |\\n| contact.crossboarding | 1 | boolean | Признак принадлежности к онбордингу |\\n| contact.createdBy | 1 | string(8) | Табельный номер создателя контакта |\\n| contact.emails | 0..1 | array(object) | Массив электронных адресов |\\n| contact.emails.value | 1 | string(100) | Электронный адрес |\\n| contact.emails.main | 1 | boolean | Признак основной почты |\\n| contact.phones | 0..1 | array(object) | Массив телефонных номеров |\\n| contact.phones.value | 1 | string(20) | Номер телефона |\\n| contact.phones.extValue | 0..1 | string(10) | Внутренний добавочный номер |\\n| contact.phones.main | 1 | boolean | Признак основного номера |\\n| contact.phones.mobile | 1 | boolean | Признак мобильного номера |\\n| client | 1 | object | Данные клиента |\\n| client.ucpId | 0..1 | string(36) | Идентификатор клиента ПАО |\\n| client.sbpId | 0..1 | string(36) | Идентификатор клиента АО |\\n| client.inn | 0..1 | string(12) | ИНН клиента |\\n| client.kpp | 0..1 | string(9) | КПП клиента |\\n\\n**Выходные параметры**\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|-------------|-------------|---------------|-------------|--------------------|--------------|---------------|\\n| contactId | string(36) | 1 | | Идентификатор контакта | | «8c7d2b5e-fa...» |\\n\",\n \"reason\": \"Реализация сервиса CLIENTS. POST /api/v1/clients/contacts-dgr из системной аналитики.\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-10T07:27:10.163248+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260410-085902-560bc90e200f.md b/runtime_traces/agent_requests/20260410-085902-560bc90e200f.md deleted file mode 100644 index 66f7174..0000000 --- a/runtime_traces/agent_requests/20260410-085902-560bc90e200f.md +++ /dev/null @@ -1,1538 +0,0 @@ -# Runtime Trace: 20260410-085902-560bc90e200f - -- active_rag_session_id: 3ae94f79-50e6-4382-bfac-560bc90e200f - -## request -```json -{ - "request_id": "req_5470648ea86a44b38f82c238f0372e19", - "session_id": "as_11e6a693c42447cfa2c4c0ac612cd0e7", - "active_rag_session_id": "3ae94f79-50e6-4382-bfac-560bc90e200f", - "process_version": "v2", - "created_at": "2026-04-10T08:59:02.572471+00:00", - "message": "Сделай документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Сделай документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "process/v2/test_doc/features/create_contact.md" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ] - }, - "confidence": 0.9500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на создание документации по системной аналитике из указанного файла create_contact.md.", - "rag_session_id": "3ae94f79-50e6-4382-bfac-560bc90e200f" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.9500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.plan_change_units", - "system_prompt": "Ты классифицируешь units системной аналитики для построения плана изменений документации.\n\nВерни только JSON:\n{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"coverage\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/coverage/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"reason\": \"...\"\n }\n ]\n}\n\nПравила:\n- Используй только doc_type из allowed_doc_types.\n- Не пропускай item, даже если не уверен: выбери наиболее близкий тип.\n- Ориентируйся на heading и snippet.\n- path — это служебное поле плана изменений, не поле frontmatter.\n- id:\n - брать из metadata unit, если задан;\n - если id нет, сгенерировать стабильный id по смыслу unit и по аналогии с существующей документацией.\n- имя файла всегда формировать строго как <id>.md.\n- для существующего документа (если это видно из контекста и индекса) путь не менять.\n- для нового документа путь формировать строго как docs/<application>/<platform>/<page_type>/<id>.md.\n- platform использовать только из допустимых значений: web, ufs, pprb.\n- page_type выбирать по doc_type (например ui_page -> ui, api_method -> api, logic_block -> logic).\n- последний сегмент path обязан совпадать с <id>.md.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"system_rules\": \"Системные правила документации:\\n1. Один устойчивый объект — один документ.\\n2. Документы не должны дублировать друг друга по смыслу.\\n3. Связи между документами должны быть явными (related_docs/links).\\n4. Документация организована иерархически по папкам docs/*.\\n5. Markdown-документ состоит из YAML frontmatter и body.\\n6. Обязательные поля frontmatter: id, title, doc_type, related_docs, status, domain, sub_domain.\",\n \"allowed_doc_types\": [\n \"ui_page\",\n \"api_method\",\n \"logic_block\",\n \"architecture_overview\",\n \"integration_doc\",\n \"domain_entity\",\n \"glossary_item\",\n \"index_page\"\n ],\n \"items\": [\n {\n \"index\": 0,\n \"heading\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"snippet\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\",\n \"known\": {\n \"type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\"\n }\n },\n {\n \"index\": 1,\n \"heading\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"snippet\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернут\",\n \"known\": {\n \"type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\"\n }\n }\n ]\n}", - "log_context": "workflow.v2.docs_update.from_feature.plan" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\",\n \"page_type\": \"ui\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\"\n },\n {\n \"index\": 1,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\"\n }\n ]\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "ui_page", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "prompt_chars": 13794, - "rules_chars": 12362 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"doc_type\": \"ui_page\",\n \"doc_id\": \"ui.contacts_dgr.create\",\n \"title\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (ui_page)\\n\\n# UI Page Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `ui_page`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одной пользовательской страницы, экрана или отдельного UI-сценария.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\n## Что описывать в Details\\n\\n- назначение страницы\\n- пользовательский сценарий\\n- основные блоки интерфейса\\n- связанные API и сущности\\n\\n## Template (ui_page)\\n\\n---\\nid: ui.example_page\\ntype: ui_page\\ndoc_type: ui_page\\nname: example_page\\ntitle: Пример UI-страницы\\nmodule: example_module\\nlayer: presentation\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Пример UI-страницы\\n\\n## Summary\\n\\nКраткое описание страницы и её назначения.\\n\\n## Details\\n\\n### Назначение страницы\\n\\n### Пользовательский сценарий\\n\\n### Основные блоки интерфейса\\n\\n### Связанные API и сущности\\n\\n### Функциональные требования\\n\\n### Нефункциональные требования\\n\\n### Ограничения и граничные случаи\\n\\n### Ошибки и валидации\\n\\n### Связанный код\\n\\n### Связанные документы\\n\\n### История изменений\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\\n\\n## Section rule: tech-use-case\\n\\n# Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять технический USE CASE в подраздел `### Сценарий` в документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n- Основной и альтернативные сценарии состоят из шагов. \\n\\n- Каждый шаг описывается одним предложением не более 15-20 слов, и состоит из двух частей. Первая часть описывает что мы делаем по смыслу, чтобы это было понятно человеку без низкоуровневых технических деталей. Например: авторизует запрос, получает данные клиента, запрашивает справочники. Вторая часть описывает как это реализовано технически - вызывает эндпоинт /path/to/resource в системе <название системы>.\\n\\n- В описании шага не должно быть длинных технических деталей. Если техничсекую реализацию нельхзя описатьодним предложенеим (в лимите длины описания шага), то необхлодимо это вынести в отдельное функциональное требование FR.<номер>. <Название> и описать в нем технические детали. А в шаге сослаться на это требование через \\\"Описание приведено в FR.<номер>. <Название>\\\"\\n\\n- Для шагов авторизации обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с интеграцией обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с проверкой условий обязательны доп шаги с описанием переходов по сценарию.\\n\\n- Название \\\"FR.<номер>. <Название>\\\" формируется следующим образом: \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий.\\n\\n- Для каждого шага при необходимости нужно прописать логику действий в случае ошибки или если логика шага определяет несколько сценариев разивития при выполнении заданных условий. \\n\\n- Для шагов, которые описывают интеграцию с другой системой необходимо указать название точки интеграции (название эндпоинта, название топика и так далее) и сделать ссылку на FR.<номер>. <Название> с описанием шагов интеграции - как сформировать запрос/сообщение, как обработать ответ, политику ретраев.\\n\\n - Сценарий собирается из тезисов, приведенных системной аналимтике в свободной формулировке\\n\\n\\n\\n\\n\\n\\n## Пример целевого описания сценария\\n\\n### Примеры шагов сценария\\n\\nПример 1\\n- Авторизует запрос пользователя по наличию у него экшена ролевой модели CI02792632.ContactsDGR.Detail\\n - В случае ошибки - завершить сценарий с кодом UNAUTHORIZED\\n\\nПример 2\\n- Запрашивает данные клиента - вызывает /api/v1/clients/{client-id}/info\\n - В случае ошибки - завершить сценарий с кодом CLIENT_INFO_REQUEST_FAIL\\n\\nПример 3\\n- Возвращает ответ в формате <название DTO>\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"proposed_content\": \"---\\nid: ui.contacts_dgr.create\\ndoc_type: ui_page\\ntitle: Контакты ДГР. Создание карточки контакта ДГР\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nstatus: draft\\nrelated_docs: []\\nupdated_at: 2023-10-10\\n---\\n\\n# Контакты ДГР. Создание карточки контакта ДГР\\n\\n## Summary\\n\\n- Назначение: создание новой карточки контакта ДГР.\\n- Actor: пользователь системы.\\n- Trigger: заполнение формы и нажатие кнопки «Добавить».\\n- Интеграция: вызов endpoint POST /api/v1/clients/contacts-dgr.\\n- Результат: отображение push-уведомления о результате операции.\\n\\n## Details\\n\\n### Назначение страницы\\nСоздание нового контакта ДГР путем ввода атрибутов и отправки данных через UI-интерфейс.\\n\\n### Пользовательский сценарий\\n- Пользователь вводит необходимые атрибуты контакта ДГР в форму.\\n- Пользователь подтверждает ввод, нажимая кнопку «Добавить», после чего инициируется вызов endpoint POST /api/v1/clients/contacts-dgr.\\n- Система ожидает ответа от backend и отображает push-уведомление об успешности или ошибке операции.\\n\\n### Основные блоки интерфейса\\n- Форма ввода атрибутов контакта ДГР.\\n- Кнопка подтверждения «Добавить».\\n- Блок отображения push-уведомлений.\\n\\n### Связанные API и сущности\\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "prompt_chars": 17899, - "rules_chars": 13886 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"ufs.contacts_dgr.api.create\",\n \"title\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию периметра CI02792632.ContactsDGR.Create. При отсутствии периметра завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернуть ответ ui.contacts_dgr в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\nКонтракт POST /contacts\\n\\nЗапрос\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\nОтвет\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор контакта |\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\\n\\n## Section rule: tech-use-case\\n\\n# Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять технический USE CASE в подраздел `### Сценарий` в документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n- Основной и альтернативные сценарии состоят из шагов. \\n\\n- Каждый шаг описывается одним предложением не более 15-20 слов, и состоит из двух частей. Первая часть описывает что мы делаем по смыслу, чтобы это было понятно человеку без низкоуровневых технических деталей. Например: авторизует запрос, получает данные клиента, запрашивает справочники. Вторая часть описывает как это реализовано технически - вызывает эндпоинт /path/to/resource в системе <название системы>.\\n\\n- В описании шага не должно быть длинных технических деталей. Если техничсекую реализацию нельхзя описатьодним предложенеим (в лимите длины описания шага), то необхлодимо это вынести в отдельное функциональное требование FR.<номер>. <Название> и описать в нем технические детали. А в шаге сослаться на это требование через \\\"Описание приведено в FR.<номер>. <Название>\\\"\\n\\n- Для шагов авторизации обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с интеграцией обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с проверкой условий обязательны доп шаги с описанием переходов по сценарию.\\n\\n- Название \\\"FR.<номер>. <Название>\\\" формируется следующим образом: \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий.\\n\\n- Для каждого шага при необходимости нужно прописать логику действий в случае ошибки или если логика шага определяет несколько сценариев разивития при выполнении заданных условий. \\n\\n- Для шагов, которые описывают интеграцию с другой системой необходимо указать название точки интеграции (название эндпоинта, название топика и так далее) и сделать ссылку на FR.<номер>. <Название> с описанием шагов интеграции - как сформировать запрос/сообщение, как обработать ответ, политику ретраев.\\n\\n - Сценарий собирается из тезисов, приведенных системной аналимтике в свободной формулировке\\n\\n\\n\\n\\n\\n\\n## Пример целевого описания сценария\\n\\n### Примеры шагов сценария\\n\\nПример 1\\n- Авторизует запрос пользователя по наличию у него экшена ролевой модели CI02792632.ContactsDGR.Detail\\n - В случае ошибки - завершить сценарий с кодом UNAUTHORIZED\\n\\nПример 2\\n- Запрашивает данные клиента - вызывает /api/v1/clients/{client-id}/info\\n - В случае ошибки - завершить сценарий с кодом CLIENT_INFO_REQUEST_FAIL\\n\\nПример 3\\n- Возвращает ответ в формате <название DTO>\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr_api_create.md\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта ДГР через POST /api/v1/clients/contacts-dgr\",\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ntype: api_method\\ndoc_type: api_method\\nname: create_contact_dgr\\ntitle: Создать контакт ДГР (POST /api/v1/clients/contacts-dgr)\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-05\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [api, contacts_dgr]\\nlinks: {}\\n---\\n\\n# Создать контакт ДГР (POST /api/v1/clients/contacts-dgr)\\n\\n## Summary\\n\\n**Purpose**: Создание нового контакта ДГР в системе клиентов.\\n**Actors**: Клиенты, API\\n**Trigger**: POST-запрос на `/api/v1/clients/contacts-dgr`\\n**Errors**: BAD_REQUEST, UNAUTHORIZED\\n**Related**: UI-страница создания контакта, контракты на уровень ниже (prpb.contacts_dgr)\\n\\n## Details\\n\\n### Описание\\nСоздание контакта ДГР осуществляется через POST-запрос к `/api/v1/clients/contacts-dgr`. Метод проверяет корректность запроса, авторизирует доступ и делегирует создание контакта другой системе.\\n\\n### Сценарий\\n\\n**Название:** Создание контакта ДГР\\n\\n**Предусловия:**\\n- Пользователь аутентифицирован в системе.\\n- У пользователя есть периметр CI02792632.ContactsDGR.Create.\\n\\n**Триггер:**\\nПользователь отправляет POST-запрос на `/api/v1/clients/contacts-dgr` с данными нового контакта.\\n\\n**Основной сценарий:**\\n1. Проверяется соответствие запроса JSON-схеме. Если ошибка, завершается сценарий с кодом BAD_REQUEST.\\n2. Выполняется проверка наличия периметра CI02792632.ContactsDGR.Create. При его отсутствии сценарий завершается с кодом UNAUTHORIZED.\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n4. Возвращается результат в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\nНет.\\n\\n**Обработка ошибок:**\\nСм. раздел \\\"Ошибки\\\".\\n\\n**Постусловие:**\\nСоздан новый контакт ДГР.\\n\\n### Функциональные требования\\n\\n**FR-1.** Проверка входящего запроса на соответствие JSON-схеме.\\n**FR-2.** Авторизация пользователя по периметру CI02792632.ContactsDGR.Create.\\n**FR-3.** Передача данных контакта в систему prpb.contacts_dgr.\\n**FR-4.** Формирование ответа в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n### Нефункциональные требования\\nОтсутствуют.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n| Атрибут | Обязательность | Тип | Где передается | Описание |\\n|------------------------|---------------|-----------------|----------------|-----------------------------------------------------------------------------|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя, вызвавшего сервис |\\n| contact | 1 | object | body | Данные контакта ДГР |\\n| client | 1 | object | body | Данные клиента |\\n| и т.д. | | | | |\\n\\n#### Выходные параметры\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|----------------|---------------|---------|-----------------------------------------|\\n| contactId | 1 | string | Идентификатор созданного контакта ДГР |\\n\\n### Интеграции\\nИнтеграция с системой prpb.contacts_dgr через endpoint POST /contacts.\\n\\n### Ошибки\\n- BAD_REQUEST: Некорректный формат запроса.\\n- UNAUTHORIZED: Отсутствие необходимого периметра.\\n\\n### Связанный код\\nОтсутствует.\\n\\n### История изменений\\nОтсутствует.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 6096, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 6096, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 6096, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6243, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 6096, - "issues_count": 0, - "issues_preview": [] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 6096, - "changeset_items": 2, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nПлан изменений:\n- create: docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md (ui_page)\n- create: docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ui.contacts_dgr.create\\ndoc_type: ui_page\\ntitle: Контакты ДГР. Создание карточки контакта ДГР\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nstatus: draft\\nrelated_docs: []\\nupdated_at: 2023-10-10\\n---\\n\\n# Контакты ДГР. Создание карточки контакта ДГР\\n\\n## Summary\\n\\n- Назначение: создание новой карточки контакта ДГР.\\n- Actor: пользователь системы.\\n- Trigger: заполнение формы и нажатие кнопки «Добавить».\\n- Интеграция: вызов endpoint POST /api/v1/clients/contacts-dgr.\\n- Результат: отображение push-уведомления о результате операции.\\n\\n## Details\\n\\n### Назначение страницы\\nСоздание нового контакта ДГР путем ввода атрибутов и отправки данных через UI-интерфейс.\\n\\n### Пользовательский сценарий\\n- Пользователь вводит необходимые атрибуты контакта ДГР в форму.\\n- Пользователь подтверждает ввод, нажимая кнопку «Добавить», после чего инициируется вызов endpoint POST /api/v1/clients/contacts-dgr.\\n- Система ожидает ответа от backend и отображает push-уведомление об успешности или ошибке операции.\\n\\n### Основные блоки интерфейса\\n- Форма ввода атрибутов контакта ДГР.\\n- Кнопка подтверждения «Добавить».\\n- Блок отображения push-уведомлений.\\n\\n### Связанные API и сущности\\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr.\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ntype: api_method\\ndoc_type: api_method\\nname: create_contact_dgr\\ntitle: Создать контакт ДГР (POST /api/v1/clients/contacts-dgr)\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-05\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [api, contacts_dgr]\\nlinks: {}\\n---\\n\\n# Создать контакт ДГР (POST /api/v1/clients/contacts-dgr)\\n\\n## Summary\\n\\n**Purpose**: Создание нового контакта ДГР в системе клиентов.\\n**Actors**: Клиенты, API\\n**Trigger**: POST-запрос на `/api/v1/clients/contacts-dgr`\\n**Errors**: BAD_REQUEST, UNAUTHORIZED\\n**Related**: UI-страница создания контакта, контракты на уровень ниже (prpb.contacts_dgr)\\n\\n## Details\\n\\n### Описание\\nСоздание контакта ДГР осуществляется через POST-запрос к `/api/v1/clients/contacts-dgr`. Метод проверяет корректность запроса, авторизирует доступ и делегирует создание контакта другой системе.\\n\\n### Сценарий\\n\\n**Название:** Создание контакта ДГР\\n\\n**Предусловия:**\\n- Пользователь аутентифицирован в системе.\\n- У пользователя есть периметр CI02792632.ContactsDGR.Create.\\n\\n**Триггер:**\\nПользователь отправляет POST-запрос на `/api/v1/clients/contacts-dgr` с данными нового контакта.\\n\\n**Основной сценарий:**\\n1. Проверяется соответствие запроса JSON-схеме. Если ошибка, завершается сценарий с кодом BAD_REQUEST.\\n2. Выполняется проверка наличия периметра CI02792632.ContactsDGR.Create. При его отсутствии сценарий завершается с кодом UNAUTHORIZED.\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n4. Возвращается результат в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\nНет.\\n\\n**Обработка ошибок:**\\nСм. раздел \\\"Ошибки\\\".\\n\\n**Постусловие:**\\nСоздан новый контакт ДГР.\\n\\n### Функциональные требования\\n\\n**FR-1.** Проверка входящего запроса на соответствие JSON-схеме.\\n**FR-2.** Авторизация пользователя по периметру CI02792632.ContactsDGR.Create.\\n**FR-3.** Передача данных контакта в систему prpb.contacts_dgr.\\n**FR-4.** Формирование ответа в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n### Нефункциональные требования\\nОтсутствуют.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n| Атрибут | Обязательность | Тип | Где передается | Описание |\\n|------------------------|---------------|-----------------|----------------|-----------------------------------------------------------------------------|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя, вызвавшего сервис |\\n| contact | 1 | object | body | Данные контакта ДГР |\\n| client | 1 | object | body | Данные клиента |\\n| и т.д. | | | | |\\n\\n#### Выходные параметры\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|----------------|---------------|---------|-----------------------------------------|\\n| contactId | 1 | string | Идентификатор созданного контакта ДГР |\\n\\n### Интеграции\\nИнтеграция с системой prpb.contacts_dgr через endpoint POST /contacts.\\n\\n### Ошибки\\n- BAD_REQUEST: Некорректный формат запроса.\\n- UNAUTHORIZED: Отсутствие необходимого периметра.\\n\\n### Связанный код\\nОтсутствует.\\n\\n### История изменений\\nОтсутствует.\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта ДГР через POST /api/v1/clients/contacts-dgr\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-10T08:59:37.933223+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260410-090548-70665e6dd3a5.md b/runtime_traces/agent_requests/20260410-090548-70665e6dd3a5.md deleted file mode 100644 index e97a071..0000000 --- a/runtime_traces/agent_requests/20260410-090548-70665e6dd3a5.md +++ /dev/null @@ -1,1861 +0,0 @@ -# Runtime Trace: 20260410-090548-70665e6dd3a5 - -- active_rag_session_id: d35c05d7-7fd6-4b8f-a46e-70665e6dd3a5 - -## request -```json -{ - "request_id": "req_27feafb8d5944d0781d4b94161288975", - "session_id": "as_0d483786550f45219b7351ea78ebe08d", - "active_rag_session_id": "d35c05d7-7fd6-4b8f-a46e-70665e6dd3a5", - "process_version": "v2", - "created_at": "2026-04-10T09:05:48.812142+00:00", - "message": "Какие эндпоинты есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие эндпоинты есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается перечня доступных эндпоинтов проекта.", - "rag_session_id": "d35c05d7-7fd6-4b8f-a46e-70665e6dd3a5" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 2 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2, - "endpoints": [ - "GET /api/v1/clients/contacts-dgr", - "GET /api/v1/clients/contacts-dgr/{contactid}" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 2 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 77 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 2 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 2 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 77 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 77 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /api/v1/clients/contacts-dgr\nGET /api/v1/clients/contacts-dgr/{contactid}", - "completed_at": "2026-04-10T09:05:51.354056+00:00" -} -``` - -## request -```json -{ - "request_id": "req_8b9170d7907c414ba720ad88e08ae22b", - "session_id": "as_0d483786550f45219b7351ea78ebe08d", - "active_rag_session_id": "d35c05d7-7fd6-4b8f-a46e-70665e6dd3a5", - "process_version": "v2", - "created_at": "2026-04-10T09:05:56.158204+00:00", - "message": "Сделай документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Сделай документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "process/v2/test_doc/features/create_contact.md" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ] - }, - "confidence": 0.9500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на создание документации по системной аналитике из указанного файла create_contact.md.", - "rag_session_id": "d35c05d7-7fd6-4b8f-a46e-70665e6dd3a5" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.9500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.plan_change_units", - "system_prompt": "Ты классифицируешь units системной аналитики для построения плана изменений документации.\n\nВерни только JSON:\n{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"coverage\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/coverage/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"reason\": \"...\"\n }\n ]\n}\n\nПравила:\n- Используй только doc_type из allowed_doc_types.\n- Не пропускай item, даже если не уверен: выбери наиболее близкий тип.\n- Ориентируйся на heading и snippet.\n- path — это служебное поле плана изменений, не поле frontmatter.\n- id:\n - брать из metadata unit, если задан;\n - если id нет, сгенерировать стабильный id по смыслу unit и по аналогии с существующей документацией.\n- имя файла всегда формировать строго как <id>.md.\n- для существующего документа (если это видно из контекста и индекса) путь не менять.\n- для нового документа путь формировать строго как docs/<application>/<platform>/<page_type>/<id>.md.\n- platform использовать только из допустимых значений: web, ufs, pprb.\n- page_type выбирать по doc_type (например ui_page -> ui, api_method -> api, logic_block -> logic).\n- последний сегмент path обязан совпадать с <id>.md.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"system_rules\": \"Системные правила документации:\\n1. Один устойчивый объект — один документ.\\n2. Документы не должны дублировать друг друга по смыслу.\\n3. Связи между документами должны быть явными (related_docs/links).\\n4. Документация организована иерархически по папкам docs/*.\\n5. Markdown-документ состоит из YAML frontmatter и body.\\n6. Обязательные поля frontmatter: id, title, doc_type, related_docs, status, domain, sub_domain.\",\n \"allowed_doc_types\": [\n \"ui_page\",\n \"api_method\",\n \"logic_block\",\n \"architecture_overview\",\n \"integration_doc\",\n \"domain_entity\",\n \"glossary_item\",\n \"index_page\"\n ],\n \"items\": [\n {\n \"index\": 0,\n \"heading\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"snippet\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\",\n \"known\": {\n \"type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\"\n }\n },\n {\n \"index\": 1,\n \"heading\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"snippet\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create. При отсутствии пермишена завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернут\",\n \"known\": {\n \"type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\"\n }\n }\n ]\n}", - "log_context": "workflow.v2.docs_update.from_feature.plan" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\",\n \"page_type\": \"ui\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\"\n },\n {\n \"index\": 1,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\"\n }\n ]\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "ui_page", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "prompt_chars": 14167, - "rules_chars": 12728 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"doc_type\": \"ui_page\",\n \"doc_id\": \"ui.contacts_dgr.create\",\n \"title\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (ui_page)\\n\\n# UI Page Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `ui_page`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одной пользовательской страницы, экрана или отдельного UI-сценария.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\n## Что описывать в Details\\n\\n- назначение страницы\\n- пользовательский сценарий\\n- основные блоки интерфейса\\n- связанные API и сущности\\n\\n## Template (ui_page)\\n\\n---\\nid: ui.example_page\\ntype: ui_page\\ndoc_type: ui_page\\nname: example_page\\ntitle: Пример UI-страницы\\nmodule: example_module\\nlayer: presentation\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Пример UI-страницы\\n\\n## Summary\\n\\nКраткое описание страницы и её назначения.\\n\\n## Details\\n\\n### Назначение страницы\\n\\n### Пользовательский сценарий\\n\\n### Основные блоки интерфейса\\n\\n### Связанные API и сущности\\n\\n### Функциональные требования\\n\\n### Нефункциональные требования\\n\\n### Ограничения и граничные случаи\\n\\n### Ошибки и валидации\\n\\n### Связанный код\\n\\n### Связанные документы\\n\\n### История изменений\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\\n\\n## Section rule: tech-use-case\\n\\n# Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять технический USE CASE в подраздел `### Сценарий` в документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n- Основной и альтернативные сценарии состоят из шагов. \\n\\n- Каждый шаг описывается одним предложением не более 15-20 слов, и состоит из двух частей. Первая часть описывает что мы делаем по смыслу, чтобы это было понятно человеку без низкоуровневых технических деталей. Например: авторизует запрос, получает данные клиента, запрашивает справочники. Вторая часть описывает как это реализовано технически - вызывает эндпоинт /path/to/resource в системе <название системы>.\\n\\n- В описании шага не должно быть длинных технических деталей. Если техничсекую реализацию нельхзя описатьодним предложенеим (в лимите длины описания шага), то необхлодимо это вынести в отдельное функциональное требование FR.<номер>. <Название> и описать в нем технические детали. А в шаге сослаться на это требование через \\\"Описание приведено в FR.<номер>. <Название>\\\"\\n\\n- Для шагов авторизации обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с интеграцией обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с проверкой условий обязательны доп шаги с описанием переходов по сценарию.\\n\\n- Название \\\"FR.<номер>. <Название>\\\" формируется следующим образом: \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий.\\n\\n- Для каждого шага при необходимости нужно прописать логику действий в случае ошибки или если логика шага определяет несколько сценариев разивития при выполнении заданных условий. \\n\\n- Для шагов, которые описывают интеграцию с другой системой необходимо указать название точки интеграции (название эндпоинта, название топика и так далее) и сделать ссылку на FR.<номер>. <Название> с описанием шагов интеграции - как сформировать запрос/сообщение, как обработать ответ, политику ретраев.\\n\\n - Сценарий собирается из тезисов, приведенных системной аналимтике в свободной формулировке\\n\\n - Функциональные требования \\\"FR.<номер>. <Название>\\\" не должны дублировать шагов сценария в use case. Они содержат детали, которые вынесены из юзкейса чтобы не делать его тяжелым. Если шаг юзкейса описывается одним предложением в лимите длины, то FR делать не нужно.\\n\\n - FR обязательно описывается для шага с интеграцией\\n - FR Не описывается для шага авторизации.\\n\\n\\n\\n\\n\\n\\n## Пример целевого описания сценария\\n\\n### Примеры шагов сценария\\n\\nПример 1\\n- Авторизует запрос пользователя по наличию у него экшена ролевой модели CI02792632.ContactsDGR.Detail\\n - В случае ошибки - завершить сценарий с кодом UNAUTHORIZED\\n\\nПример 2\\n- Запрашивает данные клиента - вызывает /api/v1/clients/{client-id}/info\\n - В случае ошибки - завершить сценарий с кодом CLIENT_INFO_REQUEST_FAIL\\n\\nПример 3\\n- Возвращает ответ в формате <название DTO>\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР из системной аналитики.\",\n \"proposed_content\": \"---\\nid: ui.contacts_dgr.create\\ndoc_type: ui_page\\ntitle: Создание карточки контакта ДГР\\nmodule: contacts_dgr\\nlayer: presentation\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [create, contact, dgr]\\nentities: []\\nlinks: {}\\n---\\n\\n# Создание карточки контакта ДГР\\n\\n## Summary\\n\\n- Назначение: создание новой карточки контакта ДГР.\\n- Актор: пользователь системы.\\n- Триггер: заполнение формы и нажатие кнопки «Добавить».\\n- API интеграция: вызов endpoint POST /api/v1/clients/contacts-dgr.\\n- Результат: отображение push-уведомления о результате операции.\\n\\n## Details\\n\\n### Назначение страницы\\nСоздание нового контакта ДГР путем ввода необходимых атрибутов и отправки данных в систему.\\n\\n### Пользовательский сценарий\\n#### Предусловия\\nПользователь имеет доступ к форме создания контактов ДГР.\\n\\n#### Триггер\\nЗаполнение атрибутов карточки и нажатие кнопки «Добавить».\\n\\n#### Основной сценарий\\n1. Пользователь вводит необходимые данные контакта ДГР.\\n2. Ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания контакта ДГР.\\n3. Ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n4. Ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\\n\\n### Основные блоки интерфейса\\nФорма ввода данных контакта ДГР, кнопка «Добавить», блок уведомлений.\\n\\n### Связанные API и сущности\\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr\\n- Обрабатывающая сущность: ufs.contacts_dgr\\n\\n### Функциональные требования\\nFR-1: Пользователю доступна форма создания контакта ДГР с необходимыми полями.\\nFR-2: При нажатии кнопки «Добавить» вызывается endpoint POST /api/v1/clients/contacts-dgr.\\nFR-3: Система корректно обрабатывает ответ от ufs.contacts_dgr и отображает уведомление пользователю.\\n\\n### Нефункциональные требования\\nОтсутствуют.\\n\\n### Ограничения и граничные случаи\\nПри ошибках интеграции выводится соответствующее сообщение об ошибке.\\n\\n### Ошибки и валидации\\nОшибки обработки запроса отображаются пользователю в виде уведомлений.\\n\\n### Связанный код\\nОтсутствует.\\n\\n### Связанные документы\\nОтсутствуют.\\n\\n### История изменений\\n- 2023-10-10: Документ создан.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "prompt_chars": 18272, - "rules_chars": 14252 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"ufs.contacts_dgr.api.create\",\n \"title\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create. При отсутствии пермишена завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернуть ответ ui.contacts_dgr в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\nКонтракт POST /contacts\\n\\nЗапрос\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\nОтвет\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор контакта |\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\\n\\n## Section rule: tech-use-case\\n\\n# Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять технический USE CASE в подраздел `### Сценарий` в документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n- Основной и альтернативные сценарии состоят из шагов. \\n\\n- Каждый шаг описывается одним предложением не более 15-20 слов, и состоит из двух частей. Первая часть описывает что мы делаем по смыслу, чтобы это было понятно человеку без низкоуровневых технических деталей. Например: авторизует запрос, получает данные клиента, запрашивает справочники. Вторая часть описывает как это реализовано технически - вызывает эндпоинт /path/to/resource в системе <название системы>.\\n\\n- В описании шага не должно быть длинных технических деталей. Если техничсекую реализацию нельхзя описатьодним предложенеим (в лимите длины описания шага), то необхлодимо это вынести в отдельное функциональное требование FR.<номер>. <Название> и описать в нем технические детали. А в шаге сослаться на это требование через \\\"Описание приведено в FR.<номер>. <Название>\\\"\\n\\n- Для шагов авторизации обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с интеграцией обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с проверкой условий обязательны доп шаги с описанием переходов по сценарию.\\n\\n- Название \\\"FR.<номер>. <Название>\\\" формируется следующим образом: \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий.\\n\\n- Для каждого шага при необходимости нужно прописать логику действий в случае ошибки или если логика шага определяет несколько сценариев разивития при выполнении заданных условий. \\n\\n- Для шагов, которые описывают интеграцию с другой системой необходимо указать название точки интеграции (название эндпоинта, название топика и так далее) и сделать ссылку на FR.<номер>. <Название> с описанием шагов интеграции - как сформировать запрос/сообщение, как обработать ответ, политику ретраев.\\n\\n - Сценарий собирается из тезисов, приведенных системной аналимтике в свободной формулировке\\n\\n - Функциональные требования \\\"FR.<номер>. <Название>\\\" не должны дублировать шагов сценария в use case. Они содержат детали, которые вынесены из юзкейса чтобы не делать его тяжелым. Если шаг юзкейса описывается одним предложением в лимите длины, то FR делать не нужно.\\n\\n - FR обязательно описывается для шага с интеграцией\\n - FR Не описывается для шага авторизации.\\n\\n\\n\\n\\n\\n\\n## Пример целевого описания сценария\\n\\n### Примеры шагов сценария\\n\\nПример 1\\n- Авторизует запрос пользователя по наличию у него экшена ролевой модели CI02792632.ContactsDGR.Detail\\n - В случае ошибки - завершить сценарий с кодом UNAUTHORIZED\\n\\nПример 2\\n- Запрашивает данные клиента - вызывает /api/v1/clients/{client-id}/info\\n - В случае ошибки - завершить сценарий с кодом CLIENT_INFO_REQUEST_FAIL\\n\\nПример 3\\n- Возвращает ответ в формате <название DTO>\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта ДГР через POST /api/v1/clients/contacts-dgr\",\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ndoc_type: api_method\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\ntags: [UFs]\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\nМетод создает новый контакт ДГР для клиента.\\n\\n- **Domain**: contacts_dgr\\n- **Sub-domain**: create_contact\\n- **Тип**: API метод\\n- **HTTP-метод**: POST\\n- **Путь**: /api/v1/clients/contacts-dgr\\n- **Аутентификация**: требуется пермишен CI02792632.ContactsDGR.Create\\n- **Ошибки**: BAD_REQUEST, UNAUTHORIZED\\n\\n## Details\\n\\n### Описание\\n\\nСоздание нового контакта ДГР путем отправки POST-запроса на endpoint /api/v1/clients/contacts-dgr. После успешной проверки схемы и аутентификации запрос передается в систему prpb.contacts_dgr для дальнейшей обработки.\\n\\n### Сценарий\\n\\n**Название:** Создание контакта ДГР\\n\\n**Предусловия:**\\n- Пользователь имеет право создавать контакты ДГР.\\n- Данные о контакте корректно заполнены и соответствуют схеме.\\n\\n**Триггер:**\\nОтправлен POST-запрос на endpoint /api/v1/clients/contacts-dgr.\\n\\n**Основной сценарий:**\\n1. Проверяется схема входящего запроса.\\n - В случае ошибки завершается сценарий с кодом BAD_REQUEST.\\n2. Авторизация запроса по пермишену CI02792632.ContactsDGR.Create.\\n - При отсутствии пермишена завершается сценарий с кодом UNAUTHORIZED.\\n3. Вызывается endpoint POST /contacts в системе prpb.contacts_dgr.\\n4. Формируется и возвращается ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\nНет.\\n\\n**Обработка ошибок:**\\nОпределяется схемой ответа.\\n\\n**Постусловие:**\\nПользователь получает уникальный идентификатор созданного контакта ДГР.\\n\\n### Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\n**FR-2.** Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызвать endpoint POST /contacts в системе prpb.contacts_dgr.\\n**FR-4.** Вернуть ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n### Нефункциональные требования\\n\\nНет специфичных требований.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя, вызвавшего сервис |\\n| contact | 1 | object | body | Данные контакта ДГР |\\n| client | 1 | object | body | Данные клиента |\\n\\nПолная спецификация тела запроса доступна в тексте требования.\\n\\n#### Выходные параметры\\n\\n| Атрибут | Тип | Обязательность | Описание |\\n|---|---|---|---|\\n| contactId | string(36) | 1 | Идентификатор контакта |\\n\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 5916, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 5916, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 5916, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 5916, - "issues_count": 0, - "issues_preview": [] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 5916, - "changeset_items": 2, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nПлан изменений:\n- create: docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md (ui_page)\n- create: docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ui.contacts_dgr.create\\ndoc_type: ui_page\\ntitle: Создание карточки контакта ДГР\\nmodule: contacts_dgr\\nlayer: presentation\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [create, contact, dgr]\\nentities: []\\nlinks: {}\\n---\\n\\n# Создание карточки контакта ДГР\\n\\n## Summary\\n\\n- Назначение: создание новой карточки контакта ДГР.\\n- Актор: пользователь системы.\\n- Триггер: заполнение формы и нажатие кнопки «Добавить».\\n- API интеграция: вызов endpoint POST /api/v1/clients/contacts-dgr.\\n- Результат: отображение push-уведомления о результате операции.\\n\\n## Details\\n\\n### Назначение страницы\\nСоздание нового контакта ДГР путем ввода необходимых атрибутов и отправки данных в систему.\\n\\n### Пользовательский сценарий\\n#### Предусловия\\nПользователь имеет доступ к форме создания контактов ДГР.\\n\\n#### Триггер\\nЗаполнение атрибутов карточки и нажатие кнопки «Добавить».\\n\\n#### Основной сценарий\\n1. Пользователь вводит необходимые данные контакта ДГР.\\n2. Ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания контакта ДГР.\\n3. Ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n4. Ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\\n\\n### Основные блоки интерфейса\\nФорма ввода данных контакта ДГР, кнопка «Добавить», блок уведомлений.\\n\\n### Связанные API и сущности\\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr\\n- Обрабатывающая сущность: ufs.contacts_dgr\\n\\n### Функциональные требования\\nFR-1: Пользователю доступна форма создания контакта ДГР с необходимыми полями.\\nFR-2: При нажатии кнопки «Добавить» вызывается endpoint POST /api/v1/clients/contacts-dgr.\\nFR-3: Система корректно обрабатывает ответ от ufs.contacts_dgr и отображает уведомление пользователю.\\n\\n### Нефункциональные требования\\nОтсутствуют.\\n\\n### Ограничения и граничные случаи\\nПри ошибках интеграции выводится соответствующее сообщение об ошибке.\\n\\n### Ошибки и валидации\\nОшибки обработки запроса отображаются пользователю в виде уведомлений.\\n\\n### Связанный код\\nОтсутствует.\\n\\n### Связанные документы\\nОтсутствуют.\\n\\n### История изменений\\n- 2023-10-10: Документ создан.\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР из системной аналитики.\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ndoc_type: api_method\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\ntags: [UFs]\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\nМетод создает новый контакт ДГР для клиента.\\n\\n- **Domain**: contacts_dgr\\n- **Sub-domain**: create_contact\\n- **Тип**: API метод\\n- **HTTP-метод**: POST\\n- **Путь**: /api/v1/clients/contacts-dgr\\n- **Аутентификация**: требуется пермишен CI02792632.ContactsDGR.Create\\n- **Ошибки**: BAD_REQUEST, UNAUTHORIZED\\n\\n## Details\\n\\n### Описание\\n\\nСоздание нового контакта ДГР путем отправки POST-запроса на endpoint /api/v1/clients/contacts-dgr. После успешной проверки схемы и аутентификации запрос передается в систему prpb.contacts_dgr для дальнейшей обработки.\\n\\n### Сценарий\\n\\n**Название:** Создание контакта ДГР\\n\\n**Предусловия:**\\n- Пользователь имеет право создавать контакты ДГР.\\n- Данные о контакте корректно заполнены и соответствуют схеме.\\n\\n**Триггер:**\\nОтправлен POST-запрос на endpoint /api/v1/clients/contacts-dgr.\\n\\n**Основной сценарий:**\\n1. Проверяется схема входящего запроса.\\n - В случае ошибки завершается сценарий с кодом BAD_REQUEST.\\n2. Авторизация запроса по пермишену CI02792632.ContactsDGR.Create.\\n - При отсутствии пермишена завершается сценарий с кодом UNAUTHORIZED.\\n3. Вызывается endpoint POST /contacts в системе prpb.contacts_dgr.\\n4. Формируется и возвращается ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\nНет.\\n\\n**Обработка ошибок:**\\nОпределяется схемой ответа.\\n\\n**Постусловие:**\\nПользователь получает уникальный идентификатор созданного контакта ДГР.\\n\\n### Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\n**FR-2.** Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызвать endpoint POST /contacts в системе prpb.contacts_dgr.\\n**FR-4.** Вернуть ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n### Нефункциональные требования\\n\\nНет специфичных требований.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя, вызвавшего сервис |\\n| contact | 1 | object | body | Данные контакта ДГР |\\n| client | 1 | object | body | Данные клиента |\\n\\nПолная спецификация тела запроса доступна в тексте требования.\\n\\n#### Выходные параметры\\n\\n| Атрибут | Тип | Обязательность | Описание |\\n|---|---|---|---|\\n| contactId | string(36) | 1 | Идентификатор контакта |\\n\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта ДГР через POST /api/v1/clients/contacts-dgr\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-10T09:06:35.660220+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260410-105605-341eb1cf5caa.md b/runtime_traces/agent_requests/20260410-105605-341eb1cf5caa.md deleted file mode 100644 index c81153d..0000000 --- a/runtime_traces/agent_requests/20260410-105605-341eb1cf5caa.md +++ /dev/null @@ -1,2544 +0,0 @@ -# Runtime Trace: 20260410-105605-341eb1cf5caa - -- active_rag_session_id: 1ff8d654-a8a5-4a66-aaf5-341eb1cf5caa - -## request -```json -{ - "request_id": "req_064c067ec48a441e941c2eb560de067d", - "session_id": "as_ce21456f5ea547cd948b7ecbe1a64e09", - "active_rag_session_id": "1ff8d654-a8a5-4a66-aaf5-341eb1cf5caa", - "process_version": "v2", - "created_at": "2026-04-10T10:56:05.888269+00:00", - "message": "Какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается перечисления доступных API-методов.", - "rag_session_id": "1ff8d654-a8a5-4a66-aaf5-341eb1cf5caa" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 2 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2, - "endpoints": [ - "GET /api/v1/clients/contacts-dgr", - "GET /api/v1/clients/contacts-dgr/{contactid}" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 2 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 77 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 2 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 2 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 77 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 77 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /api/v1/clients/contacts-dgr\nGET /api/v1/clients/contacts-dgr/{contactid}", - "completed_at": "2026-04-10T10:56:08.447916+00:00" -} -``` - -## request -```json -{ - "request_id": "req_a653f52a80f848859ec4a2f01dde6be3", - "session_id": "as_ce21456f5ea547cd948b7ecbe1a64e09", - "active_rag_session_id": "1ff8d654-a8a5-4a66-aaf5-341eb1cf5caa", - "process_version": "v2", - "created_at": "2026-04-10T10:56:34.423797+00:00", - "message": "Какой метод апи относится к функции создания (create)?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какой метод апи относится к функции создания (create)?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [ - "create", - "/create", - "create-endpoint", - "create endpoint" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT" - ] - }, - "confidence": 0.8, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается поиска метода API, связанного с функцией создания.", - "rag_session_id": "1ff8d654-a8a5-4a66-aaf5-341eb1cf5caa" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT" - ], - "endpoint_paths": [], - "target_doc_hints": [ - "create", - "/create", - "create-endpoint", - "create endpoint" - ], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "create", - "/create", - "create-endpoint", - "create endpoint" - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [ - "create", - "/create", - "create-endpoint", - "create endpoint" - ], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%create%", - "%/create%", - "%create-endpoint%", - "%create endpoint%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [ - "create", - "/create", - "create-endpoint", - "create endpoint" - ], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%", - "%create%", - "%/create%", - "%create-endpoint%", - "%create endpoint%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 2 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2, - "endpoints": [ - "GET /api/v1/clients/contacts-dgr", - "GET /api/v1/clients/contacts-dgr/{contactid}" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 2 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 77 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 2 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 2 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 77 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 77 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /api/v1/clients/contacts-dgr\nGET /api/v1/clients/contacts-dgr/{contactid}", - "completed_at": "2026-04-10T10:56:36.527870+00:00" -} -``` - -## request -```json -{ - "request_id": "req_654fe92a6b2241d9bfe8e950ee2dda2a", - "session_id": "as_ce21456f5ea547cd948b7ecbe1a64e09", - "active_rag_session_id": "1ff8d654-a8a5-4a66-aaf5-341eb1cf5caa", - "process_version": "v2", - "created_at": "2026-04-10T10:56:47.643161+00:00", - "message": "Сделай документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Сделай документацию по системной аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "process/v2/test_doc/features/create_contact.md" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ] - }, - "confidence": 0.9, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на создание документации по системной аналитике из указанного файла create_contact.md.", - "rag_session_id": "1ff8d654-a8a5-4a66-aaf5-341eb1cf5caa" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.9 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.plan_change_units", - "system_prompt": "Ты классифицируешь units системной аналитики для построения плана изменений документации.\n\nВерни только JSON:\n{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"coverage\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/coverage/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"reason\": \"...\"\n }\n ]\n}\n\nПравила:\n- Используй только doc_type из allowed_doc_types.\n- Не пропускай item, даже если не уверен: выбери наиболее близкий тип.\n- Ориентируйся на heading и snippet.\n- path — это служебное поле плана изменений, не поле frontmatter.\n- id:\n - брать из metadata unit, если задан;\n - если id нет, сгенерировать стабильный id по смыслу unit и по аналогии с существующей документацией.\n- имя файла всегда формировать строго как <id>.md.\n- для существующего документа (если это видно из контекста и индекса) путь не менять.\n- для нового документа путь формировать строго как docs/<application>/<platform>/<page_type>/<id>.md.\n- platform использовать только из допустимых значений: web, ufs, pprb.\n- page_type выбирать по doc_type (например ui_page -> ui, api_method -> api, logic_block -> logic).\n- последний сегмент path обязан совпадать с <id>.md.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"system_rules\": \"Системные правила документации:\\n1. Один устойчивый объект — один документ.\\n2. Документы не должны дублировать друг друга по смыслу.\\n3. Связи между документами должны быть явными (related_docs/links).\\n4. Документация организована иерархически по папкам docs/*.\\n5. Markdown-документ состоит из YAML frontmatter и body.\\n6. Обязательные поля frontmatter: id, title, doc_type, related_docs, status, domain, sub_domain.\",\n \"allowed_doc_types\": [\n \"ui_page\",\n \"api_method\",\n \"logic_block\",\n \"architecture_overview\",\n \"integration_doc\",\n \"domain_entity\",\n \"glossary_item\",\n \"index_page\"\n ],\n \"items\": [\n {\n \"index\": 0,\n \"heading\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"snippet\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\",\n \"known\": {\n \"type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\"\n }\n },\n {\n \"index\": 1,\n \"heading\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"snippet\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create. При отсутствии пермишена завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернут\",\n \"known\": {\n \"type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\"\n }\n }\n ]\n}", - "log_context": "workflow.v2.docs_update.from_feature.plan" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\",\n \"page_type\": \"ui\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\"\n },\n {\n \"index\": 1,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\"\n }\n ]\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "ui_page", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "prompt_chars": 15800, - "rules_chars": 14319 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"doc_type\": \"ui_page\",\n \"doc_id\": \"ui.contacts_dgr.create\",\n \"title\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (ui_page)\\n\\n# UI Page Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `ui_page`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одной пользовательской страницы, экрана или отдельного UI-сценария.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\n## Что описывать в Details\\n\\n- назначение страницы\\n- пользовательский сценарий\\n- основные блоки интерфейса\\n- связанные API и сущности\\n\\n## Template (ui_page)\\n\\n---\\nid: ui.example_page\\ntype: ui_page\\ndoc_type: ui_page\\nname: example_page\\ntitle: Пример UI-страницы\\nmodule: example_module\\nlayer: presentation\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Пример UI-страницы\\n\\n## Summary\\n\\nКраткое описание страницы и её назначения.\\n\\n## Details\\n\\n### Назначение страницы\\n\\n### Пользовательский сценарий\\n\\n### Основные блоки интерфейса\\n\\n### Связанные API и сущности\\n\\n### Функциональные требования\\n\\n### Нефункциональные требования\\n\\n### Ограничения и граничные случаи\\n\\n### Ошибки и валидации\\n\\n### Связанный код\\n\\n### Связанные документы\\n\\n### История изменений\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: fr\\n\\n# Functional requrements rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять функциональные требования в подраздел `### Функциональные требования` в документах.\\n\\n## Правила\\n- Функциональное требование (FR) расширяет и дополняет шаги, описанные в сценарии.\\n- Функциональное требование (FR) не должно копировать шаг сценария не неся дополнительной информации.\\n- Название функционального требования формируется следующим образом - \\\"FR.<номер>. <Название>\\\", где \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий (от 3 до 7 слов)\\n\\n \\n\\n## Пример целевого описания сценария\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\\n\\n\\n ### Примеры описания FR\\nFR.1. Получение данных клиента из АС ЕПК\\n1. Сформировать запрос к эндпоинту POST /api/v1/path/to/resourse в АС ЕПК\\n - Заголовки\\n - <тут идет описание заголовков и того как они формируются>\\n - Параметры запроса\\n - <тут идет описание параметров и того как они формируются>\\n - Тело запроса\\n - <тут идет описание структуры объекта JSON или payload в другмо формате так как это задано требованиями>\\n\\n2. Обработать ответ от АС ЕПК\\n Успешный ответ - <взять из описания вызываеого api критерии успешного ответа >\\n Ничего не найдено - <взять из описания вызываеого api критерии успешного овтета, опционально (если применимо)>\\n Ошибка - <взять из описания вызываеого api критерии успешного ответа >\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\\n\\n## Section rule: tech-use-case\\n\\n# Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять технический USE CASE в подраздел `### Сценарий` в документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n- Основной и альтернативные сценарии состоят из шагов. \\n\\n- Каждый шаг описывается одним предложением не более 15-20 слов, и состоит из двух частей. Первая часть описывает что мы делаем по смыслу, чтобы это было понятно человеку без низкоуровневых технических деталей. Например: авторизует запрос, получает данные клиента, запрашивает справочники. Вторая часть описывает как это реализовано технически - вызывает эндпоинт /path/to/resource в системе <название системы>.\\n\\n- В описании шага не должно быть длинных технических деталей. Если техничсекую реализацию нельхзя описатьодним предложенеим (в лимите длины описания шага), то необхлодимо это вынести в отдельное функциональное требование FR.<номер>. <Название> и описать в нем технические детали. А в шаге сослаться на это требование через \\\"Описание приведено в FR.<номер>. <Название>\\\"\\n\\n- Для шагов авторизации обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с интеграцией обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с проверкой условий обязательны доп шаги с описанием переходов по сценарию.\\n\\n- Название \\\"FR.<номер>. <Название>\\\" формируется следующим образом: \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий.\\n\\n- Для каждого шага при необходимости нужно прописать логику действий в случае ошибки или если логика шага определяет несколько сценариев разивития при выполнении заданных условий. \\n\\n- Для шагов, которые описывают интеграцию с другой системой необходимо указать название точки интеграции (название эндпоинта, название топика и так далее) и сделать ссылку на FR.<номер>. <Название> с описанием шагов интеграции - как сформировать запрос/сообщение, как обработать ответ, политику ретраев.\\n\\n - Сценарий собирается из тезисов, приведенных системной аналимтике в свободной формулировке\\n\\n - Функциональные требования \\\"FR.<номер>. <Название>\\\" не должны дублировать шагов сценария в use case. Они содержат детали, которые вынесены из юзкейса чтобы не делать его тяжелым. Если шаг юзкейса описывается одним предложением в лимите длины, то FR делать не нужно.\\n\\n - FR обязательно описывается для шага с интеграцией\\n - FR Не описывается для шага авторизации.\\n\\n\\n\\n\\n\\n\\n## Пример целевого описания сценария\\n\\n### Примеры шагов сценария\\n\\nПример 1\\n- Авторизует запрос пользователя по наличию у него экшена ролевой модели CI02792632.ContactsDGR.Detail\\n - В случае ошибки - завершить сценарий с кодом UNAUTHORIZED\\n\\nПример 2\\n- Запрашивает данные клиента - вызывает /api/v1/clients/{client-id}/info\\n - В случае ошибки - завершить сценарий с кодом CLIENT_INFO_REQUEST_FAIL\\n\\nПример 3\\n- Возвращает ответ в формате <название DTO>\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР из системной аналитики.\",\n \"proposed_content\": \"---\\nid: ui.contacts_dgr.create\\ndoc_type: ui_page\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-04\\n---\\n\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\n\n## Summary\n\n- Назначение: создание новой карточки контакта ДГР.\n- Действие пользователя: заполнение атрибутов и нажатие кнопки «Добавить».\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr.\n- Ответственный компонент: ufs.contacts_dgr.\n- Результат: push-уведомление о результате создания контакта.\n\n## Details\n\n### Назначение страницы\n\nСтраница предназначена для создания новых карточек контактов ДГР пользователями системы.\n\n### Пользовательский сценарий\n\nПользователь заполняет необходимые атрибуты контактной карточки и инициирует процесс создания, нажимая кнопку «Добавить».\n\n### Основные блоки интерфейса\n\n- Форма ввода атрибутов контакта.\n- Кнопка подтверждения добавления («Добавить»).\n\n### Связанные API и сущности\n\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr.\n- Ответственный сервис: ufs.contacts_dgr.\n\n### Функциональные требования\n\nFR-1: Отправка корректно заполненной формы на сервер через endpoint POST /api/v1/clients/contacts-dgr.\n\n### Нефункциональные требования\n\nNFR-1: Время отклика сервера на создание нового контакта не превышает 3 секунд.\n\n### Ограничения и граничные случаи\n\n- Обязательность заполнения всех обязательных полей перед отправкой.\n- Валидность введённых данных.\n\n### Ошибки и валидации\n\nВ случае некорректности данных или сетевых проблем отображается соответствующее уведомление пользователю.\n\n### Связанный код\n\nКод реализации формы и логики отправки находится в модуле `clients_contacts`.\n\n### Связанные документы\n\nОтсутствуют.\n\n### История изменений\n\nДата: 04.10.2023 - Первоначальная версия документа.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "prompt_chars": 19905, - "rules_chars": 15843 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"ufs.contacts_dgr.api.create\",\n \"title\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create. При отсутствии пермишена завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернуть ответ ui.contacts_dgr в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\nКонтракт POST /contacts\\n\\nЗапрос\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\nОтвет\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор контакта |\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: fr\\n\\n# Functional requrements rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять функциональные требования в подраздел `### Функциональные требования` в документах.\\n\\n## Правила\\n- Функциональное требование (FR) расширяет и дополняет шаги, описанные в сценарии.\\n- Функциональное требование (FR) не должно копировать шаг сценария не неся дополнительной информации.\\n- Название функционального требования формируется следующим образом - \\\"FR.<номер>. <Название>\\\", где \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий (от 3 до 7 слов)\\n\\n \\n\\n## Пример целевого описания сценария\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\\n\\n\\n ### Примеры описания FR\\nFR.1. Получение данных клиента из АС ЕПК\\n1. Сформировать запрос к эндпоинту POST /api/v1/path/to/resourse в АС ЕПК\\n - Заголовки\\n - <тут идет описание заголовков и того как они формируются>\\n - Параметры запроса\\n - <тут идет описание параметров и того как они формируются>\\n - Тело запроса\\n - <тут идет описание структуры объекта JSON или payload в другмо формате так как это задано требованиями>\\n\\n2. Обработать ответ от АС ЕПК\\n Успешный ответ - <взять из описания вызываеого api критерии успешного ответа >\\n Ничего не найдено - <взять из описания вызываеого api критерии успешного овтета, опционально (если применимо)>\\n Ошибка - <взять из описания вызываеого api критерии успешного ответа >\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\\n\\n## Section rule: tech-use-case\\n\\n# Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять технический USE CASE в подраздел `### Сценарий` в документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n- Основной и альтернативные сценарии состоят из шагов. \\n\\n- Каждый шаг описывается одним предложением не более 15-20 слов, и состоит из двух частей. Первая часть описывает что мы делаем по смыслу, чтобы это было понятно человеку без низкоуровневых технических деталей. Например: авторизует запрос, получает данные клиента, запрашивает справочники. Вторая часть описывает как это реализовано технически - вызывает эндпоинт /path/to/resource в системе <название системы>.\\n\\n- В описании шага не должно быть длинных технических деталей. Если техничсекую реализацию нельхзя описатьодним предложенеим (в лимите длины описания шага), то необхлодимо это вынести в отдельное функциональное требование FR.<номер>. <Название> и описать в нем технические детали. А в шаге сослаться на это требование через \\\"Описание приведено в FR.<номер>. <Название>\\\"\\n\\n- Для шагов авторизации обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с интеграцией обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с проверкой условий обязательны доп шаги с описанием переходов по сценарию.\\n\\n- Название \\\"FR.<номер>. <Название>\\\" формируется следующим образом: \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий.\\n\\n- Для каждого шага при необходимости нужно прописать логику действий в случае ошибки или если логика шага определяет несколько сценариев разивития при выполнении заданных условий. \\n\\n- Для шагов, которые описывают интеграцию с другой системой необходимо указать название точки интеграции (название эндпоинта, название топика и так далее) и сделать ссылку на FR.<номер>. <Название> с описанием шагов интеграции - как сформировать запрос/сообщение, как обработать ответ, политику ретраев.\\n\\n - Сценарий собирается из тезисов, приведенных системной аналимтике в свободной формулировке\\n\\n - Функциональные требования \\\"FR.<номер>. <Название>\\\" не должны дублировать шагов сценария в use case. Они содержат детали, которые вынесены из юзкейса чтобы не делать его тяжелым. Если шаг юзкейса описывается одним предложением в лимите длины, то FR делать не нужно.\\n\\n - FR обязательно описывается для шага с интеграцией\\n - FR Не описывается для шага авторизации.\\n\\n\\n\\n\\n\\n\\n## Пример целевого описания сценария\\n\\n### Примеры шагов сценария\\n\\nПример 1\\n- Авторизует запрос пользователя по наличию у него экшена ролевой модели CI02792632.ContactsDGR.Detail\\n - В случае ошибки - завершить сценарий с кодом UNAUTHORIZED\\n\\nПример 2\\n- Запрашивает данные клиента - вызывает /api/v1/clients/{client-id}/info\\n - В случае ошибки - завершить сценарий с кодом CLIENT_INFO_REQUEST_FAIL\\n\\nПример 3\\n- Возвращает ответ в формате <название DTO>\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта методом POST /api/v1/clients/contacts-dgr\",\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ndoc_type: api_method\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Сервис создания контактов CLIENTS. Метод POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\nЦель данного API-метода – создать новый контакт клиента в системе CLIENTS.\\n\\n**Purpose**: Создание нового контакта клиента.\\n**Method**: POST\\n**URL**: `/api/v1/clients/contacts-dgr`\\n**Auth required**: Да\\n**Errors**: BAD_REQUEST, UNAUTHORIZED\\n\\n## Details\\n\\n## Описание\\nМетод предназначен для создания новых индивидуальных или групповых контактов клиентов в системе CLIENTS.\\n\\n## Сценарий\\n\\n**Название:** Создание контакта\\n\\n**Предусловия:**\\n- Запрос содержит корректную схему JSON.\\n- Пользователь имеет пермишен CI02792632.ContactsDGR.Create.\\n\\n**Триггер:**\\nОтправка POST-запроса на URL `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность JSON-схемы запроса.\\n2. Производится авторизация пользователя.\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr.\\n4. Формируется и возвращается ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\n- Если схема JSON некорректна, завершается сценарий с ошибкой BAD_REQUEST.\\n- Если пользователь не обладает необходимым пермишеном, завершается сценарий с ошибкой UNAUTHORIZED.\\n\\n**Обработка ошибок:**\\n- Пошагово описаны выше.\\n\\n**Постусловие:**\\nСоздан новый контакт клиента.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\n**FR-2.** Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n**FR-4.** Вернуть ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Нефункциональные требования\\n(Не указаны)\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| contact | 1 | object | Данные контакта ДГР |\\n| client | 1 | object | Данные клиента |\\n(и далее атрибуты объектов contact и client)\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Описание |\\n|---|---|---|---|\\n| contactId | string(36) | 1 | Идентификатор созданного контакта |\\n\\n## Интеграции\\nИнтеграция с сервисом prpb.contacts_dgr через endpoint POST /contacts.\\n\\n## Ошибки\\nBAD_REQUEST, UNAUTHORIZED\\n\\n## Связанный код\\nUfsBaseResponseContactDGRCreateRsDto\\n\\n## История изменений\\n(Пока пуста)\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 5627, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 5627, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 5627, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 5627, - "issues_count": 0, - "issues_preview": [] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 5627, - "changeset_items": 2, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nПлан изменений:\n- create: docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md (ui_page)\n- create: docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ui.contacts_dgr.create\\ndoc_type: ui_page\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-04\\n---\\n\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\n\\n## Summary\\n\\n- Назначение: создание новой карточки контакта ДГР.\\n- Действие пользователя: заполнение атрибутов и нажатие кнопки «Добавить».\\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr.\\n- Ответственный компонент: ufs.contacts_dgr.\\n- Результат: push-уведомление о результате создания контакта.\\n\\n## Details\\n\\n### Назначение страницы\\n\\nСтраница предназначена для создания новых карточек контактов ДГР пользователями системы.\\n\\n### Пользовательский сценарий\\n\\nПользователь заполняет необходимые атрибуты контактной карточки и инициирует процесс создания, нажимая кнопку «Добавить».\\n\\n### Основные блоки интерфейса\\n\\n- Форма ввода атрибутов контакта.\\n- Кнопка подтверждения добавления («Добавить»).\\n\\n### Связанные API и сущности\\n\\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr.\\n- Ответственный сервис: ufs.contacts_dgr.\\n\\n### Функциональные требования\\n\\nFR-1: Отправка корректно заполненной формы на сервер через endpoint POST /api/v1/clients/contacts-dgr.\\n\\n### Нефункциональные требования\\n\\nNFR-1: Время отклика сервера на создание нового контакта не превышает 3 секунд.\\n\\n### Ограничения и граничные случаи\\n\\n- Обязательность заполнения всех обязательных полей перед отправкой.\\n- Валидность введённых данных.\\n\\n### Ошибки и валидации\\n\\nВ случае некорректности данных или сетевых проблем отображается соответствующее уведомление пользователю.\\n\\n### Связанный код\\n\\nКод реализации формы и логики отправки находится в модуле `clients_contacts`.\\n\\n### Связанные документы\\n\\nОтсутствуют.\\n\\n### История изменений\\n\\nДата: 04.10.2023 - Первоначальная версия документа.\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР из системной аналитики.\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ndoc_type: api_method\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Сервис создания контактов CLIENTS. Метод POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\nЦель данного API-метода – создать новый контакт клиента в системе CLIENTS.\\n\\n**Purpose**: Создание нового контакта клиента.\\n**Method**: POST\\n**URL**: `/api/v1/clients/contacts-dgr`\\n**Auth required**: Да\\n**Errors**: BAD_REQUEST, UNAUTHORIZED\\n\\n## Details\\n\\n## Описание\\nМетод предназначен для создания новых индивидуальных или групповых контактов клиентов в системе CLIENTS.\\n\\n## Сценарий\\n\\n**Название:** Создание контакта\\n\\n**Предусловия:**\\n- Запрос содержит корректную схему JSON.\\n- Пользователь имеет пермишен CI02792632.ContactsDGR.Create.\\n\\n**Триггер:**\\nОтправка POST-запроса на URL `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность JSON-схемы запроса.\\n2. Производится авторизация пользователя.\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr.\\n4. Формируется и возвращается ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\n- Если схема JSON некорректна, завершается сценарий с ошибкой BAD_REQUEST.\\n- Если пользователь не обладает необходимым пермишеном, завершается сценарий с ошибкой UNAUTHORIZED.\\n\\n**Обработка ошибок:**\\n- Пошагово описаны выше.\\n\\n**Постусловие:**\\nСоздан новый контакт клиента.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\n**FR-2.** Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n**FR-4.** Вернуть ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Нефункциональные требования\\n(Не указаны)\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| contact | 1 | object | Данные контакта ДГР |\\n| client | 1 | object | Данные клиента |\\n(и далее атрибуты объектов contact и client)\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Описание |\\n|---|---|---|---|\\n| contactId | string(36) | 1 | Идентификатор созданного контакта |\\n\\n## Интеграции\\nИнтеграция с сервисом prpb.contacts_dgr через endpoint POST /contacts.\\n\\n## Ошибки\\nBAD_REQUEST, UNAUTHORIZED\\n\\n## Связанный код\\nUfsBaseResponseContactDGRCreateRsDto\\n\\n## История изменений\\n(Пока пуста)\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта методом POST /api/v1/clients/contacts-dgr\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-10T10:57:23.636071+00:00" -} -``` - -## request -```json -{ - "request_id": "req_d7cd2138f2ee4e7c83c7e3492fc43952", - "session_id": "as_ce21456f5ea547cd948b7ecbe1a64e09", - "active_rag_session_id": "1ff8d654-a8a5-4a66-aaf5-341eb1cf5caa", - "process_version": "v2", - "created_at": "2026-04-10T10:57:32.557791+00:00", - "message": "Какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается перечисления методов API.", - "rag_session_id": "1ff8d654-a8a5-4a66-aaf5-341eb1cf5caa" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 2 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2, - "endpoints": [ - "GET /api/v1/clients/contacts-dgr", - "GET /api/v1/clients/contacts-dgr/{contactid}" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 2 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 77 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 2 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 2 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 77 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 77 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /api/v1/clients/contacts-dgr\nGET /api/v1/clients/contacts-dgr/{contactid}", - "completed_at": "2026-04-10T10:57:34.481617+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260410-105744-60a847d31356.md b/runtime_traces/agent_requests/20260410-105744-60a847d31356.md deleted file mode 100644 index e6d15ca..0000000 --- a/runtime_traces/agent_requests/20260410-105744-60a847d31356.md +++ /dev/null @@ -1,649 +0,0 @@ -# Runtime Trace: 20260410-105744-60a847d31356 - -- active_rag_session_id: ff0b0f32-4d2a-48dc-9774-60a847d31356 - -## request -```json -{ - "request_id": "req_584447665c2241b09898744020bd6e94", - "session_id": "as_192902d97ee44c569ab45fd508890092", - "active_rag_session_id": "ff0b0f32-4d2a-48dc-9774-60a847d31356", - "process_version": "v2", - "created_at": "2026-04-10T10:57:44.691409+00:00", - "message": "Какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается списка доступных API-методов.", - "rag_session_id": "ff0b0f32-4d2a-48dc-9774-60a847d31356" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 3 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2, - "endpoints": [ - "GET /api/v1/clients/contacts-dgr", - "GET /api/v1/clients/contacts-dgr/{contactid}" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 2 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 77 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 3 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 2 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 77 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 77 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /api/v1/clients/contacts-dgr\nGET /api/v1/clients/contacts-dgr/{contactid}", - "completed_at": "2026-04-10T10:57:46.741492+00:00" -} -``` - -## request -```json -{ - "request_id": "req_c4c41fc4dfe34104a2d6a23dc9b5a5af", - "session_id": "as_192902d97ee44c569ab45fd508890092", - "active_rag_session_id": "ff0b0f32-4d2a-48dc-9774-60a847d31356", - "process_version": "v2", - "created_at": "2026-04-10T10:57:51.052891+00:00", - "message": "Какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается списка доступных API-методов.", - "rag_session_id": "ff0b0f32-4d2a-48dc-9774-60a847d31356" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 3 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2, - "endpoints": [ - "GET /api/v1/clients/contacts-dgr", - "GET /api/v1/clients/contacts-dgr/{contactid}" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 2 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 77 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 3 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 2 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 77 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 77 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /api/v1/clients/contacts-dgr\nGET /api/v1/clients/contacts-dgr/{contactid}", - "completed_at": "2026-04-10T10:57:52.887621+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260410-112313-5e81a827ea36.md b/runtime_traces/agent_requests/20260410-112313-5e81a827ea36.md deleted file mode 100644 index 1d316cd..0000000 --- a/runtime_traces/agent_requests/20260410-112313-5e81a827ea36.md +++ /dev/null @@ -1,326 +0,0 @@ -# Runtime Trace: 20260410-112313-5e81a827ea36 - -- active_rag_session_id: eaded8e6-68f4-41b4-a4ac-5e81a827ea36 - -## request -```json -{ - "request_id": "req_4c84fafeba0b4b1eaa7f8a30442b1281", - "session_id": "as_b47105603b6640b28577ab27083b1499", - "active_rag_session_id": "eaded8e6-68f4-41b4-a4ac-5e81a827ea36", - "process_version": "v2", - "created_at": "2026-04-10T11:23:13.818952+00:00", - "message": "какие методы апи есть в проекте?" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "normalized_query": "какие методы апи есть в проекте?", - "target_terms": [], - "anchors": { - "entity_names": [], - "file_names": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "global", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно касается перечисления доступных API-методов проекта.", - "rag_session_id": "eaded8e6-68f4-41b4-a4ac-5e81a827ea36" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_EXPLAIN", - "subintent": "API_EXPOSED", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [], - "endpoint_paths": [], - "target_doc_hints": [], - "matched_aliases": [], - "target_terms": [] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "require_rag_session", - "title": "Проверка RAG-сессии" - }, - "input": {}, - "output": { - "has_rag_session": true - } -} -``` - -## process.v2.retrieval_policy -```json -{ - "event": "retrieval_plan_resolved", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "limit": 400, - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## process.v2.pipeline -```json -{ - "event": "retrieval_profile_selected", - "profile": "api_exposed", - "layers": [ - "D1_DOCUMENT_CATALOG" - ], - "filters": { - "metadata.type": "api_method", - "prefer_path_prefixes": [ - "docs/api/", - "docs/endpoints/", - "docs/methods/", - "api/", - "endpoints/", - "methods/" - ], - "target_doc_hints": [], - "prefer_like_patterns": [ - "%api%", - "%endpoint%", - "%method%", - "%эндпоинт%", - "%метод%" - ] - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана" - }, - "input": {}, - "output": { - "profile": "api_exposed" - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "fetch_rag_rows", - "title": "Получение строк из RAG" - }, - "input": {}, - "output": { - "retrieved_row_count": 3 - } -} -``` - -## process.v2.evidence -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2, - "endpoints": [ - "GET /api/v1/clients/contacts-dgr", - "GET /api/v1/clients/contacts-dgr/{contactid}" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "evidence_assembled", - "mode": "api_exposed", - "endpoint_count": 2 -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "build_api_exposed_evidence", - "title": "Сборка списка API" - }, - "input": {}, - "output": { - "endpoint_count": 2 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_explain.api_exposed", - "step": { - "id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API" - }, - "input": {}, - "output": { - "answer_length": 77 - } -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_explain.api_exposed", - "steps": [ - { - "step_id": "require_rag_session", - "title": "Проверка RAG-сессии", - "input": {}, - "output": { - "has_rag_session": true - } - }, - { - "step_id": "resolve_retrieval_plan", - "title": "Выбор retrieval-плана", - "input": {}, - "output": { - "profile": "api_exposed" - } - }, - { - "step_id": "fetch_rag_rows", - "title": "Получение строк из RAG", - "input": {}, - "output": { - "retrieved_row_count": 3 - } - }, - { - "step_id": "build_api_exposed_evidence", - "title": "Сборка списка API", - "input": {}, - "output": { - "endpoint_count": 2 - } - }, - { - "step_id": "finalize_api_exposed_answer", - "title": "Формирование ответа со списком API", - "input": {}, - "output": { - "answer_length": 77 - } - } - ] -} -``` - -## workflow.v2.api_exposed -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_explain.api_exposed" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "deterministic", - "answer_length": 77 -} -``` - -## result -```json -{ - "status": "done", - "answer": "GET /api/v1/clients/contacts-dgr\nGET /api/v1/clients/contacts-dgr/{contactid}", - "completed_at": "2026-04-10T11:23:16.382407+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260410-115411-d8eee7186d3c.md b/runtime_traces/agent_requests/20260410-115411-d8eee7186d3c.md deleted file mode 100644 index 7103b9f..0000000 --- a/runtime_traces/agent_requests/20260410-115411-d8eee7186d3c.md +++ /dev/null @@ -1,1566 +0,0 @@ -# Runtime Trace: 20260410-115411-d8eee7186d3c - -- active_rag_session_id: 6728976c-0af8-426c-8de7-d8eee7186d3c - -## request -```json -{ - "request_id": "req_83d42364a2ea4ed194378093e87f046b", - "session_id": "as_4130dced39a64c3d854a52e38cce0971", - "active_rag_session_id": "6728976c-0af8-426c-8de7-d8eee7186d3c", - "process_version": "v2", - "created_at": "2026-04-10T11:54:11.381669+00:00", - "message": "Опиши документаци по аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Опиши документаци по аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "process/v2/test_doc/features/create_contact.md" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ] - }, - "confidence": 0.8500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос содержит указание на конкретный файл с аналитикой и требует описания документации.", - "rag_session_id": "6728976c-0af8-426c-8de7-d8eee7186d3c" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.8500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.plan_change_units", - "system_prompt": "Ты классифицируешь units системной аналитики для построения плана изменений документации.\n\nВерни только JSON:\n{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"coverage\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/coverage/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"reason\": \"...\"\n }\n ]\n}\n\nПравила:\n- Используй только doc_type из allowed_doc_types.\n- Не пропускай item, даже если не уверен: выбери наиболее близкий тип.\n- Ориентируйся на heading и snippet.\n- path — это служебное поле плана изменений, не поле frontmatter.\n- id:\n - брать из metadata unit, если задан;\n - если id нет, сгенерировать стабильный id по смыслу unit и по аналогии с существующей документацией.\n- имя файла всегда формировать строго как <id>.md.\n- для существующего документа (если это видно из контекста и индекса) путь не менять.\n- для нового документа путь формировать строго как docs/<application>/<platform>/<page_type>/<id>.md.\n- platform использовать только из допустимых значений: web, ufs, pprb.\n- page_type выбирать по doc_type (например ui_page -> ui, api_method -> api, logic_block -> logic).\n- последний сегмент path обязан совпадать с <id>.md.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"system_rules\": \"Системные правила документации:\\n1. Один устойчивый объект — один документ.\\n2. Документы не должны дублировать друг друга по смыслу.\\n3. Связи между документами должны быть явными (related_docs/links).\\n4. Документация организована иерархически по папкам docs/*.\\n5. Markdown-документ состоит из YAML frontmatter и body.\\n6. Обязательные поля frontmatter: id, title, doc_type, related_docs, status, domain, sub_domain.\",\n \"allowed_doc_types\": [\n \"ui_page\",\n \"api_method\",\n \"logic_block\",\n \"architecture_overview\",\n \"integration_doc\",\n \"domain_entity\",\n \"glossary_item\",\n \"index_page\"\n ],\n \"items\": [\n {\n \"index\": 0,\n \"heading\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"snippet\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\",\n \"known\": {\n \"type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\"\n }\n },\n {\n \"index\": 1,\n \"heading\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"snippet\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create. При отсутствии пермишена завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернут\",\n \"known\": {\n \"type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\"\n }\n }\n ]\n}", - "log_context": "workflow.v2.docs_update.from_feature.plan" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\",\n \"page_type\": \"ui\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\"\n },\n {\n \"index\": 1,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\"\n }\n ]\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "ui_page", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "prompt_chars": 15882, - "rules_chars": 14400 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"doc_type\": \"ui_page\",\n \"doc_id\": \"ui.contacts_dgr.create\",\n \"title\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n- Для документов с `doc_type: api_method` поле `endpoint` является обязательным.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (ui_page)\\n\\n# UI Page Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `ui_page`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одной пользовательской страницы, экрана или отдельного UI-сценария.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\n## Что описывать в Details\\n\\n- назначение страницы\\n- пользовательский сценарий\\n- основные блоки интерфейса\\n- связанные API и сущности\\n\\n## Template (ui_page)\\n\\n---\\nid: ui.example_page\\ntype: ui_page\\ndoc_type: ui_page\\nname: example_page\\ntitle: Пример UI-страницы\\nmodule: example_module\\nlayer: presentation\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Пример UI-страницы\\n\\n## Summary\\n\\nКраткое описание страницы и её назначения.\\n\\n## Details\\n\\n### Назначение страницы\\n\\n### Пользовательский сценарий\\n\\n### Основные блоки интерфейса\\n\\n### Связанные API и сущности\\n\\n### Функциональные требования\\n\\n### Нефункциональные требования\\n\\n### Ограничения и граничные случаи\\n\\n### Ошибки и валидации\\n\\n### Связанный код\\n\\n### Связанные документы\\n\\n### История изменений\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: fr\\n\\n# Functional requrements rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять функциональные требования в подраздел `### Функциональные требования` в документах.\\n\\n## Правила\\n- Функциональное требование (FR) расширяет и дополняет шаги, описанные в сценарии.\\n- Функциональное требование (FR) не должно копировать шаг сценария не неся дополнительной информации.\\n- Название функционального требования формируется следующим образом - \\\"FR.<номер>. <Название>\\\", где \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий (от 3 до 7 слов)\\n\\n \\n\\n## Пример целевого описания сценария\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\\n\\n\\n ### Примеры описания FR\\nFR.1. Получение данных клиента из АС ЕПК\\n1. Сформировать запрос к эндпоинту POST /api/v1/path/to/resourse в АС ЕПК\\n - Заголовки\\n - <тут идет описание заголовков и того как они формируются>\\n - Параметры запроса\\n - <тут идет описание параметров и того как они формируются>\\n - Тело запроса\\n - <тут идет описание структуры объекта JSON или payload в другмо формате так как это задано требованиями>\\n\\n2. Обработать ответ от АС ЕПК\\n Успешный ответ - <взять из описания вызываеого api критерии успешного ответа >\\n Ничего не найдено - <взять из описания вызываеого api критерии успешного овтета, опционально (если применимо)>\\n Ошибка - <взять из описания вызываеого api критерии успешного ответа >\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\\n\\n## Section rule: tech-use-case\\n\\n# Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять технический USE CASE в подраздел `### Сценарий` в документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n- Основной и альтернативные сценарии состоят из шагов. \\n\\n- Каждый шаг описывается одним предложением не более 15-20 слов, и состоит из двух частей. Первая часть описывает что мы делаем по смыслу, чтобы это было понятно человеку без низкоуровневых технических деталей. Например: авторизует запрос, получает данные клиента, запрашивает справочники. Вторая часть описывает как это реализовано технически - вызывает эндпоинт /path/to/resource в системе <название системы>.\\n\\n- В описании шага не должно быть длинных технических деталей. Если техничсекую реализацию нельхзя описатьодним предложенеим (в лимите длины описания шага), то необхлодимо это вынести в отдельное функциональное требование FR.<номер>. <Название> и описать в нем технические детали. А в шаге сослаться на это требование через \\\"Описание приведено в FR.<номер>. <Название>\\\"\\n\\n- Для шагов авторизации обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с интеграцией обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с проверкой условий обязательны доп шаги с описанием переходов по сценарию.\\n\\n- Название \\\"FR.<номер>. <Название>\\\" формируется следующим образом: \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий.\\n\\n- Для каждого шага при необходимости нужно прописать логику действий в случае ошибки или если логика шага определяет несколько сценариев разивития при выполнении заданных условий. \\n\\n- Для шагов, которые описывают интеграцию с другой системой необходимо указать название точки интеграции (название эндпоинта, название топика и так далее) и сделать ссылку на FR.<номер>. <Название> с описанием шагов интеграции - как сформировать запрос/сообщение, как обработать ответ, политику ретраев.\\n\\n - Сценарий собирается из тезисов, приведенных системной аналимтике в свободной формулировке\\n\\n - Функциональные требования \\\"FR.<номер>. <Название>\\\" не должны дублировать шагов сценария в use case. Они содержат детали, которые вынесены из юзкейса чтобы не делать его тяжелым. Если шаг юзкейса описывается одним предложением в лимите длины, то FR делать не нужно.\\n\\n - FR обязательно описывается для шага с интеграцией\\n - FR Не описывается для шага авторизации.\\n\\n\\n\\n\\n\\n\\n## Пример целевого описания сценария\\n\\n### Примеры шагов сценария\\n\\nПример 1\\n- Авторизует запрос пользователя по наличию у него экшена ролевой модели CI02792632.ContactsDGR.Detail\\n - В случае ошибки - завершить сценарий с кодом UNAUTHORIZED\\n\\nПример 2\\n- Запрашивает данные клиента - вызывает /api/v1/clients/{client-id}/info\\n - В случае ошибки - завершить сценарий с кодом CLIENT_INFO_REQUEST_FAIL\\n\\nПример 3\\n- Возвращает ответ в формате <название DTO>\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"proposed_content\": \"---\\\\nid: ui.contacts_dgr.create\\\\ndoc_type: ui_page\\\\ntitle: Создание карточки контакта ДГР\\\\ndomain: contacts_dgr\\\\nsub_domain: create_contact\\\\nrelated_docs: []\\\\nstatus: draft\\\\n---\\\\n# Создание карточки контакта ДГР\\\\n## Summary\\\\n- Пользователь вводит данные контакта ДГР.\\\\n- Отправляется запрос на создание через API.\\\\n- Отображается уведомление о результате.\\\\n## Details\\\\n### Назначение страницы\\\\nСтраница предназначена для ввода и сохранения новой карточки контакта ДГР.\\\\n### Пользовательский сценарий\\\\n1. Пользователь заполняет форму с данными контакта.\\\\n2. Нажимает кнопку «Добавить».\\\\n3. Вызывается API-метод POST /api/v1/clients/contacts-dgr.\\\\n4. Отображается push-уведомление о результате операции.\\\\n### Связанные API и сущности\\\\n- **API**: POST /api/v1/clients/contacts-dgr\\\\n### Функциональные требования\\\\nFR-1: При нажатии кнопки «Добавить» осуществляется вызов API-метода POST /api/v1/clients/contacts-dgr с переданными параметрами формы.\\\\n### Нефункциональные требования\\\\nNFR-1: Время отклика API не превышает 3 секунд.\\\\n### Ограничения и граничные случаи\\\\n- Недопустимы пустые значения обязательных полей.\\\\n### Ошибки и валидации\\\\n- Проверяется корректность введенных данных.\\\\n- При ошибке возвращается сообщение об ошибке.\\\\n### Связанный код\\\\n- ufs.contacts_dgr (обработка запросов)\\\\n### Связанные документы\\\\nНет\\\\n### История изменений\\\\nНет\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "prompt_chars": 20119, - "rules_chars": 16054 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"ufs.contacts_dgr.api.create\",\n \"title\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create. При отсутствии пермишена завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернуть ответ ui.contacts_dgr в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\nКонтракт POST /contacts\\n\\nЗапрос\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\nОтвет\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор контакта |\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n- Для документов с `doc_type: api_method` поле `endpoint` является обязательным.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Во frontmatter обязательно указывать `endpoint` (например: `POST /api/v1/clients/contacts-dgr`).\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nendpoint: POST /api/v1/example\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: fr\\n\\n# Functional requrements rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять функциональные требования в подраздел `### Функциональные требования` в документах.\\n\\n## Правила\\n- Функциональное требование (FR) расширяет и дополняет шаги, описанные в сценарии.\\n- Функциональное требование (FR) не должно копировать шаг сценария не неся дополнительной информации.\\n- Название функционального требования формируется следующим образом - \\\"FR.<номер>. <Название>\\\", где \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий (от 3 до 7 слов)\\n\\n \\n\\n## Пример целевого описания сценария\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\\n\\n\\n ### Примеры описания FR\\nFR.1. Получение данных клиента из АС ЕПК\\n1. Сформировать запрос к эндпоинту POST /api/v1/path/to/resourse в АС ЕПК\\n - Заголовки\\n - <тут идет описание заголовков и того как они формируются>\\n - Параметры запроса\\n - <тут идет описание параметров и того как они формируются>\\n - Тело запроса\\n - <тут идет описание структуры объекта JSON или payload в другмо формате так как это задано требованиями>\\n\\n2. Обработать ответ от АС ЕПК\\n Успешный ответ - <взять из описания вызываеого api критерии успешного ответа >\\n Ничего не найдено - <взять из описания вызываеого api критерии успешного овтета, опционально (если применимо)>\\n Ошибка - <взять из описания вызываеого api критерии успешного ответа >\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\\n\\n## Section rule: tech-use-case\\n\\n# Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять технический USE CASE в подраздел `### Сценарий` в документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n- Основной и альтернативные сценарии состоят из шагов. \\n\\n- Каждый шаг описывается одним предложением не более 15-20 слов, и состоит из двух частей. Первая часть описывает что мы делаем по смыслу, чтобы это было понятно человеку без низкоуровневых технических деталей. Например: авторизует запрос, получает данные клиента, запрашивает справочники. Вторая часть описывает как это реализовано технически - вызывает эндпоинт /path/to/resource в системе <название системы>.\\n\\n- В описании шага не должно быть длинных технических деталей. Если техничсекую реализацию нельхзя описатьодним предложенеим (в лимите длины описания шага), то необхлодимо это вынести в отдельное функциональное требование FR.<номер>. <Название> и описать в нем технические детали. А в шаге сослаться на это требование через \\\"Описание приведено в FR.<номер>. <Название>\\\"\\n\\n- Для шагов авторизации обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с интеграцией обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с проверкой условий обязательны доп шаги с описанием переходов по сценарию.\\n\\n- Название \\\"FR.<номер>. <Название>\\\" формируется следующим образом: \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий.\\n\\n- Для каждого шага при необходимости нужно прописать логику действий в случае ошибки или если логика шага определяет несколько сценариев разивития при выполнении заданных условий. \\n\\n- Для шагов, которые описывают интеграцию с другой системой необходимо указать название точки интеграции (название эндпоинта, название топика и так далее) и сделать ссылку на FR.<номер>. <Название> с описанием шагов интеграции - как сформировать запрос/сообщение, как обработать ответ, политику ретраев.\\n\\n - Сценарий собирается из тезисов, приведенных системной аналимтике в свободной формулировке\\n\\n - Функциональные требования \\\"FR.<номер>. <Название>\\\" не должны дублировать шагов сценария в use case. Они содержат детали, которые вынесены из юзкейса чтобы не делать его тяжелым. Если шаг юзкейса описывается одним предложением в лимите длины, то FR делать не нужно.\\n\\n - FR обязательно описывается для шага с интеграцией\\n - FR Не описывается для шага авторизации.\\n\\n\\n\\n\\n\\n\\n## Пример целевого описания сценария\\n\\n### Примеры шагов сценария\\n\\nПример 1\\n- Авторизует запрос пользователя по наличию у него экшена ролевой модели CI02792632.ContactsDGR.Detail\\n - В случае ошибки - завершить сценарий с кодом UNAUTHORIZED\\n\\nПример 2\\n- Запрашивает данные клиента - вызывает /api/v1/clients/{client-id}/info\\n - В случае ошибки - завершить сценарий с кодом CLIENT_INFO_REQUEST_FAIL\\n\\nПример 3\\n- Возвращает ответ в формате <название DTO>\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr_api_create.md\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта методом POST /api/v1/clients/contacts-dgr\",\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ntype: api_method\\ndoc_type: api_method\\nname: create_contact\\ntitle: CREATE КОНТАКТА CONTACTS_DGR API\\nmodule: contacts_dgr\\nlayer: ufservice\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nendpoint: POST /api/v1/clients/contacts-dgr\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-10\\ntags: [clients, contact]\\nentities: []\\nlinks: {}\\n---\\n\\n# CREATE КОНТАКТА CONTACTS_DGR API\\n\\n## Summary\\n\\nЦель метода: создание нового контакта клиентов в системе Contacts DGR.\\n\\n**Purpose**: Создание контакта.\\n**Actor**: Клиенты системы.\\n**Trigger**: Запрос POST /api/v1/clients/contacts-dgr.\\n**Errors**: BAD_REQUEST, UNAUTHORIZED.\\n\\n## Details\\n\\n## Описание\\n\\nМетод позволяет создавать новый контакт клиента в системе Contacts DGR.\\n\\n## Сценарий\\n\\n**Название:** Создание контакта\\n\\n**Предусловия:**\\n- Пользователь аутентифицирован в системе.\\n- Имеются корректные данные о контакте и клиенте.\\n\\n**Триггер:**\\n- Отправлен HTTP-запрос POST /api/v1/clients/contacts-dgr.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность входящего запроса (FR-1).\\n2. Выполняется проверка прав доступа пользователя (FR-2).\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr (FR-3).\\n4. Формируется и возвращается ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\nНет.\\n\\n**Обработка ошибок:**\\n- В случае ошибки проверки схемы запроса – завершение сценария с кодом BAD_REQUEST.\\n- При отсутствии необходимого пермишена – завершение сценария с кодом UNAUTHORIZED.\\n\\n**Постусловие:**\\nСоздан контакт клиента в системе Contacts DGR.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\n**FR-2.** Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n\\n## Нефункциональные требования\\nОтсутствуют.\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Атрибут | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---------|----------------|------------------|---------------|---------------------|---------------------------------------------------------------------------------------------|---------------------------------|\\n| headers | header | | | | Хедеры запроса | |\\n| X-Request-Id | header | uuid | 1 | | Сквозной идентификатор вызова | e8b6e5c2-f8f7-4a6c-bd1e-c97b811d5b26 |\\n| X-Client-Ident-Id | header | string(50) | 1 | | Идентификатор системы потребителя | client1 |\\n| X-Employee-Number | header | string(8) | 0..1 | | Табельный номер пользователя, вызвавшего сервис | 12345678 |\\n| body | body | object | | | Тело запроса с данными контакта и клиента | |\\n| contact | body | object | 1 | | Данные контакта ДГР | |\\n| lastName | body | string(100) | 0..1 | | Фамилия контакта | Иванов |\\n| firstName | body | string(100) | 0..1 | | Имя контакта | Иван |\\n| middleName | body | string(100) | 0..1 | | Отчество контакта | Иванович |\\n| name | body | string(100) | 0..1 | | Название группового контакта | Группа 1 |\\n| description | body | string(1000) | 0..1 | | Описание группового контакта | Тестовое описание группы контактов |\\n| position | body | string(100) | 0..1 | | Должность контакта у клиента | Менеджер |\\n| comment | body | string(1000) | 0..1 | | Комментарий к контакту | Дополнительная информация |\\n| contactType | body | enum(string) | 1 | Individual, Group | Тип контакта | Individual |\\n| crossboarding | body | boolean | 1 | | Признак принадлежности контакта к процессу онбординга | true |\\n| createdBy | body | string(8) | 1 | | Табельный номер пользователя, создавшего контакт | 12345678 |\\n| emails | body | array(object) | 0..1 | | Массив электронных адресов контакта | |\\n| value | body | string(100) | 1 | внутри массива emails | Электронный адрес | ivan.ivanov@example.com |\\n| main | body | boolean | 1 | внутри массива emails | Признак основной почты | true |\\n| phones | body | array(object) | 0..1 | | Массив телефонных номеров контакта | |\\n| value | body | string(20) | 1 | внутри массива phones | Телефонный номер контакта | +79998887766 |\\n| extValue | body | string(10) | 0..1 | внутри массива phones | Добавочный номер | 123 |\\n| main | body | boolean | 1 | внутри массива phones | Признак основного телефона | true |\\n| mobile | body | boolean | 1 | внутри массива phones | Признак мобильного телефона | false |\\n| client | body | object | 1 | | Данные клиента | |\\n| ucpId | body | string(36) | 0..1 | | Идентификатор клиента ПАО | 123e4567-e89b-12d3-a456-426614174000 |\\n| sbpId | body | string(36) | 0..1 | | Идентификатор клиента АО | 123e4567-e89b-12d3-a456-426614174001 |\\n| inn | body | string(12) | 0..1 | | ИНН клиента | 123456789012 |\\n| kpp | body | string(9) | 0..1 | | КПП клиента | 123456789 |\\n\\n### Выходные параметры\\n\\n| Атрибут | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|------------|----------------|---------------|--------------|-----------------------------------------|-----------------|----------------------|\\n| contactId | string(36) | 1 | UUID format | Идентификатор созданного контакта | system generated | 123e4567-e89b-12d3-a456-426614174000 |\\n\\n## Интеграции\\n\\nИнтеграция с сервисом prpb.contacts_dgr через endpoint POST /contacts.\\n\\n## Ошибки\\n\\nHTTP-код 400 BAD_REQUEST – неверный формат запроса.\\nHTTP-код 401 UNAUTHORIZED – отсутствует необходимый пермишен.\"\n}\"" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_json_parse_failed", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "raw_chars": 10165 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.repair_doc_changeset_json", - "system_prompt": "Ты ремонтируешь невалидный ответ модели и должен вернуть строго валидный JSON changeset.\n\nВход содержит:\n- expected_contract: ожидаемые поля и ограничения.\n- raw_llm_output: исходный (возможно невалидный) ответ.\n\nЗадача:\n- Извлеки максимально полный смысл из raw_llm_output.\n- Верни ровно один JSON-объект, соответствующий expected_contract.\n- Если часть данных отсутствует, используй безопасные значения по умолчанию:\n - reason: \"generated by repair\"\n - proposed_content: только если op=create/update, иначе не добавляй.\n\nОграничения вывода:\n- Только JSON-объект, без markdown/code fences/комментариев.\n- Двойные кавычки, без trailing commas.\n- Внутри строк (особенно proposed_content) все переносы строк должны быть экранированы как \\\\n, не literal newline.", - "user_prompt": "{\n \"expected_contract\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"required_keys\": [\n \"op\",\n \"path\",\n \"reason\"\n ],\n \"proposed_content_required_for\": [\n \"create\",\n \"update\"\n ]\n },\n \"raw_llm_output\": \"{\\n \\\"op\\\": \\\"create\\\",\\n \\\"path\\\": \\\"docs/contacts_dgr/ufs/api/ufs.contacts_dgr_api_create.md\\\",\\n \\\"reason\\\": \\\"Реализация сервиса CLIENTS. Создание контакта методом POST /api/v1/clients/contacts-dgr\\\",\\n \\\"proposed_content\\\": \\\"---\\\\nid: ufs.contacts_dgr.api.create\\\\ntype: api_method\\\\ndoc_type: api_method\\\\nname: create_contact\\\\ntitle: CREATE КОНТАКТА CONTACTS_DGR API\\\\nmodule: contacts_dgr\\\\nlayer: ufservice\\\\ndomain: contacts_dgr\\\\nsub_domain: create_contact\\\\nendpoint: POST /api/v1/clients/contacts-dgr\\\\nrelated_docs: []\\\\nstatus: draft\\\\nupdated_at: 2023-10-10\\\\ntags: [clients, contact]\\\\nentities: []\\\\nlinks: {}\\\\n---\\\\n\\\\n# CREATE КОНТАКТА CONTACTS_DGR API\\\\n\\\\n## Summary\\\\n\\\\nЦель метода: создание нового контакта клиентов в системе Contacts DGR.\\\\n\\\\n**Purpose**: Создание контакта.\\\\n**Actor**: Клиенты системы.\\\\n**Trigger**: Запрос POST /api/v1/clients/contacts-dgr.\\\\n**Errors**: BAD_REQUEST, UNAUTHORIZED.\\\\n\\\\n## Details\\\\n\\\\n## Описание\\\\n\\\\nМетод позволяет создавать новый контакт клиента в системе Contacts DGR.\\\\n\\\\n## Сценарий\\\\n\\\\n**Название:** Создание контакта\\\\n\\\\n**Предусловия:**\\\\n- Пользователь аутентифицирован в системе.\\\\n- Имеются корректные данные о контакте и клиенте.\\\\n\\\\n**Триггер:**\\\\n- Отправлен HTTP-запрос POST /api/v1/clients/contacts-dgr.\\\\n\\\\n**Основной сценарий:**\\\\n1. Проверяется валидность входящего запроса (FR-1).\\\\n2. Выполняется проверка прав доступа пользователя (FR-2).\\\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr (FR-3).\\\\n4. Формируется и возвращается ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\\\n\\\\n**Альтернативный сценарий:**\\\\nНет.\\\\n\\\\n**Обработка ошибок:**\\\\n- В случае ошибки проверки схемы запроса – завершение сценария с кодом BAD_REQUEST.\\\\n- При отсутствии необходимого пермишена – завершение сценария с кодом UNAUTHORIZED.\\\\n\\\\n**Постусловие:**\\\\nСоздан контакт клиента в системе Contacts DGR.\\\\n\\\\n## Функциональные требования\\\\n\\\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\\\n**FR-2.** Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create.\\\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr.\\\\n\\\\n## Нефункциональные требования\\\\nОтсутствуют.\\\\n\\\\n## Контракт\\\\n\\\\n### Входные параметры\\\\n\\\\n| Атрибут | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\\\n|---------|----------------|------------------|---------------|---------------------|---------------------------------------------------------------------------------------------|---------------------------------|\\\\n| headers | header | | | | Хедеры запроса | |\\\\n| X-Request-Id | header | uuid | 1 | | Сквозной идентификатор вызова | e8b6e5c2-f8f7-4a6c-bd1e-c97b811d5b26 |\\\\n| X-Client-Ident-Id | header | string(50) | 1 | | Идентификатор системы потребителя | client1 |\\\\n| X-Employee-Number | header | string(8) | 0..1 | | Табельный номер пользователя, вызвавшего сервис | 12345678 |\\\\n| body | body | object | | | Тело запроса с данными контакта и клиента | |\\\\n| contact | body | object | 1 | | Данные контакта ДГР | |\\\\n| lastName | body | string(100) | 0..1 | | Фамилия контакта | Иванов |\\\\n| firstName | body | string(100) | 0..1 | | Имя контакта | Иван |\\\\n| middleName | body | string(100) | 0..1 | | Отчество контакта | Иванович |\\\\n| name | body | string(100) | 0..1 | | Название группового контакта | Группа 1 |\\\\n| description | body | string(1000) | 0..1 | | Описание группового контакта | Тестовое описание группы контактов |\\\\n| position | body | string(100) | 0..1 | | Должность контакта у клиента | Менеджер |\\\\n| comment | body | string(1000) | 0..1 | | Комментарий к контакту | Дополнительная информация |\\\\n| contactType | body | enum(string) | 1 | Individual, Group | Тип контакта | Individual |\\\\n| crossboarding | body | boolean | 1 | | Признак принадлежности контакта к процессу онбординга | true |\\\\n| createdBy | body | string(8) | 1 | | Табельный номер пользователя, создавшего контакт | 12345678 |\\\\n| emails | body | array(object) | 0..1 | | Массив электронных адресов контакта | |\\\\n| value | body | string(100) | 1 | внутри массива emails | Электронный адрес | ivan.ivanov@example.com |\\\\n| main | body | boolean | 1 | внутри массива emails | Признак основной почты | true |\\\\n| phones | body | array(object) | 0..1 | | Массив телефонных номеров контакта | |\\\\n| value | body | string(20) | 1 | внутри массива phones | Телефонный номер контакта | +79998887766 |\\\\n| extValue | body | string(10) | 0..1 | внутри массива phones | Добавочный номер | 123 |\\\\n| main | body | boolean | 1 | внутри массива phones | Признак основного телефона | true |\\\\n| mobile | body | boolean | 1 | внутри массива phones | Признак мобильного телефона | false |\\\\n| client | body | object | 1 | | Данные клиента | |\\\\n| ucpId | body | string(36) | 0..1 | | Идентификатор клиента ПАО | 123e4567-e89b-12d3-a456-426614174000 |\\\\n| sbpId | body | string(36) | 0..1 | | Идентификатор клиента АО | 123e4567-e89b-12d3-a456-426614174001 |\\\\n| inn | body | string(12) | 0..1 | | ИНН клиента | 123456789012 |\\\\n| kpp | body | string(9) | 0..1 | | КПП клиента | 123456789 |\\\\n\\\\n### Выходные параметры\\\\n\\\\n| Атрибут | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\\\n|------------|----------------|---------------|--------------|-----------------------------------------|-----------------|----------------------|\\\\n| contactId | string(36) | 1 | UUID format | Идентификатор созданного контакта | system generated | 123e4567-e89b-12d3-a456-426614174000 |\\\\n\\\\n## Интеграции\\\\n\\\\nИнтеграция с сервисом prpb.contacts_dgr через endpoint POST /contacts.\\\\n\\\\n## Ошибки\\\\n\\\\nHTTP-код 400 BAD_REQUEST – неверный формат запроса.\\\\nHTTP-код 401 UNAUTHORIZED – отсутствует необходимый пермишен.\\\"\\n}\\\"\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset_repair" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\"op\":\"create\",\"path\":\"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\"reason\":\"Реализация сервиса CLIENTS. Создание контакта методом POST /api/v1/clients/contacts-dgr\",\"proposed_content\":\"---\\\\nid: ufs.contacts_dgr.api.create\\\\ntype: api_method\\\\ndoc_type: api_method\\\\nname: create_contact\\\\ntitle: CREATE КОНТАКТА CONTACTS_DGR API\\\\nmodule: contacts_dgr\\\\nlayer: ufservice\\\\ndomain: contacts_dgr\\\\nsub_domain: create_contact\\\\nendpoint: POST /api/v1/clients/contacts-dgr\\\\nrelated_docs: []\\\\nstatus: draft\\\\nupdated_at: 2023-10-10\\\\ntags: [clients, contact]\\\\nentities: []\\\\nlinks: {}\\\\n---\\\\n\\\\n# CREATE КОНТАКТА CONTACTS_DGR API\\\\n\\\\n## Summary\\\\n\\\\nЦель метода: создание нового контакта клиентов в системе Contacts DGR.\\\\n\\\\n**Purpose**: Создание контакта.\\\\n**Actor**: Клиенты системы.\\\\n**Trigger**: Запрос POST /api/v1/clients/contacts-dgr.\\\\n**Errors**: BAD_REQUEST, UNAUTHORIZED.\\\\n\\\\n## Details\\\\n\\\\n## Описание\\\\n\\\\nМетод позволяет создавать новый контакт клиента в системе Contacts DGR.\\\\n\\\\n## Сценарий\\\\n\\\\n**Название:** Создание контакта\\\\n\\\\n**Предусловия:**\\\\n- Пользователь аутентифицирован в системе.\\\\n- Имеются корректные данные о контакте и клиенте.\\\\n\\\\n**Триггер:**\\\\n- Отправлен HTTP-запрос POST /api/v1/clients/contacts-dgr.\\\\n\\\\n**Основной сценарий:**\\\\n1. Проверяется валидность входящего запроса (FR-1).\\\\n2. Выполняется проверка прав доступа пользователя (FR-2).\\\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr (FR-3).\\\\n4. Формируется и возвращается ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\\\n\\\\n**Альтернативный сценарий:**\\\\nНет.\\\\n\\\\n**Обработка ошибок:**\\\\n- В случае ошибки проверки схемы запроса – завершение сценария с кодом BAD_REQUEST.\\\\n- При отсутствии необходимого пермишена – завершение сценария с кодом UNAUTHORIZED.\\\\n\\\\n**Постусловие:**\\\\nСоздан контакт клиента в системе Contacts DGR.\\\\n\\\\n## Функциональные требования\\\\n\\\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\\\n**FR-2.** Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create.\\\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr.\\\\n\\\\n## Нефункциональные требования\\\\nОтсутствуют.\\\\n\\\\n## Контракт\\\\n\\\\n### Входные параметры\\\\n\\\\n| Атрибут | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\\\n|---------|----------------|------------------|---------------|---------------------|---------------------------------------------------------------------------------------------|--------------------------------|\\\\n| headers | header | | | | Хедеры запроса | |\\\\n| X-Request-Id | header | uuid | 1 | | Сквозной идентификатор вызова | e8b6e5c2-f8f7-4a6c-bd1e-c97b811d5b26 |\\\\n| X-Client-Ident-Id | header | string(50) | 1 | | Идентификатор системы потребителя | client1 |\\\\n| X-Employee-Number | header | string(8) | 0..1 | | Табельный номер пользователя, вызвавшего сервис | 12345678 |\\\\n| body | body | object | | | Тело запроса с данными контакта и клиента | |\\\\n| contact | body | object | 1 | | Данные контакта ДГР | |\\\\n| lastName | body | string(100) | 0..1 | | Фамилия контакта | Иванов |\\\\n| firstName | body | string(100) | 0..1 | | Имя контакта | Иван |\\\\n| middleName | body | string(100) | 0..1 | | Отчество контакта | Иванович |\\\\n| name | body | string(100) | 0..1 | | Название группового контакта | Группа 1 |\\\\n| description | body | string(1000) | 0..1 | | Описание группового контакта | Тестовое описание группы контактов |\\\\n| position | body | string(100) | 0..1 | | Должность контакта у клиента | Менеджер |\\\\n| comment | body | string(1000) | 0..1 | | Комментарий к контакту | Дополнительная информация |\\\\n| contactType | body | enum(string) | 1 | Individual, Group | Тип контакта | Individual |\\\\n| crossboarding | body | boolean | 1 | | Признак принадлежности контакта к процессу онбординга | true |\\\\n| createdBy | body | string(8) | 1 | | Табельный номер пользователя, создавшего контакт | 12345678 |\\\\n| emails | body | array(object) | 0..1 | | Массив электронных адресов контакта | |\\\\n| value | body | string(100) | 1 | внутри массива emails | Электронный адрес | ivan.ivanov@example.com |\\\\n| main | body | boolean | 1 | внутри массива emails | Признак основной почты | true |\\\\n| phones | body | array(object) | 0..1 | | Массив телефонных номеров контакта | |\\\\n| value | body | string(20) | 1 | внутри массива phones | Телефонный номер контакта | +79998887766 |\\\\n| extValue | body | string(10) | 0..1 | внутри массива phones | Добавочный номер | 123 |\\\\n| main | body | boolean | 1 | внутри массива phones | Признак основного телефона | true |\\\\n| mobile | body | boolean | 1 | внутри массива phones | Признак мобильного телефона | false |\\\\n| client | body | object | 1 | | Данные клиента | |\\\\n| ucpId | body | string(36) | 0..1 | | Идентификатор клиента ПАО | 123e4567-e89b-12d3-a456-426614174000 |\\\\n| sbpId | body | string(36) | 0..1 | | Идентификатор клиента АО | 123e4567-e89b-12d3-a456-426614174001 |\\\\n| inn | body | string(12) | 0..1 | | ИНН клиента | 123456789012 |\\\\n| kpp | body | string(9) | 0..1 | | КПП клиента | 123456789 |\\\\n\\\\n### Выходные параметры\\\\n\\\\n| Атрибут | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\\\n|------------|----------------|---------------|--------------|-----------------------------------------|-----------------|----------------------|\\\\n| contactId | string(36) | 1 | UUID format | Идентификатор созданного контакта | system generated | 123e4567-e89b-12d3-a456-426614174000 |\\\\n\\\\n## Интеграции\\\\n\\\\nИнтеграция с сервисом prpb.contacts_dgr через endpoint POST /contacts.\\\\n\\\\n## Ошибки\\\\n\\\\nHTTP-код 400 BAD_REQUEST – неверный формат запроса.\\\\nHTTP-код 401 UNAUTHORIZED – отсутствует необходимый пермишен.\"}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 12237, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 12237, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 12237, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 12237, - "issues_count": 0, - "issues_preview": [] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 12237, - "changeset_items": 2, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nПлан изменений:\n- create: docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md (ui_page)\n- create: docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\\\nid: ui.contacts_dgr.create\\\\ndoc_type: ui_page\\\\ntitle: Создание карточки контакта ДГР\\\\ndomain: contacts_dgr\\\\nsub_domain: create_contact\\\\nrelated_docs: []\\\\nstatus: draft\\\\n---\\\\n# Создание карточки контакта ДГР\\\\n## Summary\\\\n- Пользователь вводит данные контакта ДГР.\\\\n- Отправляется запрос на создание через API.\\\\n- Отображается уведомление о результате.\\\\n## Details\\\\n### Назначение страницы\\\\nСтраница предназначена для ввода и сохранения новой карточки контакта ДГР.\\\\n### Пользовательский сценарий\\\\n1. Пользователь заполняет форму с данными контакта.\\\\n2. Нажимает кнопку «Добавить».\\\\n3. Вызывается API-метод POST /api/v1/clients/contacts-dgr.\\\\n4. Отображается push-уведомление о результате операции.\\\\n### Связанные API и сущности\\\\n- **API**: POST /api/v1/clients/contacts-dgr\\\\n### Функциональные требования\\\\nFR-1: При нажатии кнопки «Добавить» осуществляется вызов API-метода POST /api/v1/clients/contacts-dgr с переданными параметрами формы.\\\\n### Нефункциональные требования\\\\nNFR-1: Время отклика API не превышает 3 секунд.\\\\n### Ограничения и граничные случаи\\\\n- Недопустимы пустые значения обязательных полей.\\\\n### Ошибки и валидации\\\\n- Проверяется корректность введенных данных.\\\\n- При ошибке возвращается сообщение об ошибке.\\\\n### Связанный код\\\\n- ufs.contacts_dgr (обработка запросов)\\\\n### Связанные документы\\\\nНет\\\\n### История изменений\\\\nНет\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\\\nid: ufs.contacts_dgr.api.create\\\\ntype: api_method\\\\ndoc_type: api_method\\\\nname: create_contact\\\\ntitle: CREATE КОНТАКТА CONTACTS_DGR API\\\\nmodule: contacts_dgr\\\\nlayer: ufservice\\\\ndomain: contacts_dgr\\\\nsub_domain: create_contact\\\\nendpoint: POST /api/v1/clients/contacts-dgr\\\\nrelated_docs: []\\\\nstatus: draft\\\\nupdated_at: 2023-10-10\\\\ntags: [clients, contact]\\\\nentities: []\\\\nlinks: {}\\\\n---\\\\n\\\\n# CREATE КОНТАКТА CONTACTS_DGR API\\\\n\\\\n## Summary\\\\n\\\\nЦель метода: создание нового контакта клиентов в системе Contacts DGR.\\\\n\\\\n**Purpose**: Создание контакта.\\\\n**Actor**: Клиенты системы.\\\\n**Trigger**: Запрос POST /api/v1/clients/contacts-dgr.\\\\n**Errors**: BAD_REQUEST, UNAUTHORIZED.\\\\n\\\\n## Details\\\\n\\\\n## Описание\\\\n\\\\nМетод позволяет создавать новый контакт клиента в системе Contacts DGR.\\\\n\\\\n## Сценарий\\\\n\\\\n**Название:** Создание контакта\\\\n\\\\n**Предусловия:**\\\\n- Пользователь аутентифицирован в системе.\\\\n- Имеются корректные данные о контакте и клиенте.\\\\n\\\\n**Триггер:**\\\\n- Отправлен HTTP-запрос POST /api/v1/clients/contacts-dgr.\\\\n\\\\n**Основной сценарий:**\\\\n1. Проверяется валидность входящего запроса (FR-1).\\\\n2. Выполняется проверка прав доступа пользователя (FR-2).\\\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr (FR-3).\\\\n4. Формируется и возвращается ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\\\n\\\\n**Альтернативный сценарий:**\\\\nНет.\\\\n\\\\n**Обработка ошибок:**\\\\n- В случае ошибки проверки схемы запроса – завершение сценария с кодом BAD_REQUEST.\\\\n- При отсутствии необходимого пермишена – завершение сценария с кодом UNAUTHORIZED.\\\\n\\\\n**Постусловие:**\\\\nСоздан контакт клиента в системе Contacts DGR.\\\\n\\\\n## Функциональные требования\\\\n\\\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\\\n**FR-2.** Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create.\\\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr.\\\\n\\\\n## Нефункциональные требования\\\\nОтсутствуют.\\\\n\\\\n## Контракт\\\\n\\\\n### Входные параметры\\\\n\\\\n| Атрибут | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\\\n|---------|----------------|------------------|---------------|---------------------|---------------------------------------------------------------------------------------------|--------------------------------|\\\\n| headers | header | | | | Хедеры запроса | |\\\\n| X-Request-Id | header | uuid | 1 | | Сквозной идентификатор вызова | e8b6e5c2-f8f7-4a6c-bd1e-c97b811d5b26 |\\\\n| X-Client-Ident-Id | header | string(50) | 1 | | Идентификатор системы потребителя | client1 |\\\\n| X-Employee-Number | header | string(8) | 0..1 | | Табельный номер пользователя, вызвавшего сервис | 12345678 |\\\\n| body | body | object | | | Тело запроса с данными контакта и клиента | |\\\\n| contact | body | object | 1 | | Данные контакта ДГР | |\\\\n| lastName | body | string(100) | 0..1 | | Фамилия контакта | Иванов |\\\\n| firstName | body | string(100) | 0..1 | | Имя контакта | Иван |\\\\n| middleName | body | string(100) | 0..1 | | Отчество контакта | Иванович |\\\\n| name | body | string(100) | 0..1 | | Название группового контакта | Группа 1 |\\\\n| description | body | string(1000) | 0..1 | | Описание группового контакта | Тестовое описание группы контактов |\\\\n| position | body | string(100) | 0..1 | | Должность контакта у клиента | Менеджер |\\\\n| comment | body | string(1000) | 0..1 | | Комментарий к контакту | Дополнительная информация |\\\\n| contactType | body | enum(string) | 1 | Individual, Group | Тип контакта | Individual |\\\\n| crossboarding | body | boolean | 1 | | Признак принадлежности контакта к процессу онбординга | true |\\\\n| createdBy | body | string(8) | 1 | | Табельный номер пользователя, создавшего контакт | 12345678 |\\\\n| emails | body | array(object) | 0..1 | | Массив электронных адресов контакта | |\\\\n| value | body | string(100) | 1 | внутри массива emails | Электронный адрес | ivan.ivanov@example.com |\\\\n| main | body | boolean | 1 | внутри массива emails | Признак основной почты | true |\\\\n| phones | body | array(object) | 0..1 | | Массив телефонных номеров контакта | |\\\\n| value | body | string(20) | 1 | внутри массива phones | Телефонный номер контакта | +79998887766 |\\\\n| extValue | body | string(10) | 0..1 | внутри массива phones | Добавочный номер | 123 |\\\\n| main | body | boolean | 1 | внутри массива phones | Признак основного телефона | true |\\\\n| mobile | body | boolean | 1 | внутри массива phones | Признак мобильного телефона | false |\\\\n| client | body | object | 1 | | Данные клиента | |\\\\n| ucpId | body | string(36) | 0..1 | | Идентификатор клиента ПАО | 123e4567-e89b-12d3-a456-426614174000 |\\\\n| sbpId | body | string(36) | 0..1 | | Идентификатор клиента АО | 123e4567-e89b-12d3-a456-426614174001 |\\\\n| inn | body | string(12) | 0..1 | | ИНН клиента | 123456789012 |\\\\n| kpp | body | string(9) | 0..1 | | КПП клиента | 123456789 |\\\\n\\\\n### Выходные параметры\\\\n\\\\n| Атрибут | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\\\n|------------|----------------|---------------|--------------|-----------------------------------------|-----------------|----------------------|\\\\n| contactId | string(36) | 1 | UUID format | Идентификатор созданного контакта | system generated | 123e4567-e89b-12d3-a456-426614174000 |\\\\n\\\\n## Интеграции\\\\n\\\\nИнтеграция с сервисом prpb.contacts_dgr через endpoint POST /contacts.\\\\n\\\\n## Ошибки\\\\n\\\\nHTTP-код 400 BAD_REQUEST – неверный формат запроса.\\\\nHTTP-код 401 UNAUTHORIZED – отсутствует необходимый пермишен.\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта методом POST /api/v1/clients/contacts-dgr\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-10T11:55:43.958091+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260410-120145-6928a618382d.md b/runtime_traces/agent_requests/20260410-120145-6928a618382d.md deleted file mode 100644 index 51bd007..0000000 --- a/runtime_traces/agent_requests/20260410-120145-6928a618382d.md +++ /dev/null @@ -1,1538 +0,0 @@ -# Runtime Trace: 20260410-120145-6928a618382d - -- active_rag_session_id: 24bca5cf-5b10-41f6-838f-6928a618382d - -## request -```json -{ - "request_id": "req_29a806a470f8490bbba594f41d5ed02a", - "session_id": "as_d8f7d860f6304887b6b25c0ef349c224", - "active_rag_session_id": "24bca5cf-5b10-41f6-838f-6928a618382d", - "process_version": "v2", - "created_at": "2026-04-10T12:01:45.493323+00:00", - "message": "Сделай документацию по аналитике из /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" -} -``` - -## process.v2 -```json -{ - "event": "intent_routed", - "routing_domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "normalized_query": "Сделай документацию по аналитике из /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ], - "anchors": { - "entity_names": [ - "Users", - "Dev_projects_v2" - ], - "file_names": [ - "process/v2/test_doc/features/create_contact.md" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "process_domain": null, - "process_subdomain": null, - "scope_type": "entity", - "candidate_domains": [], - "candidate_subdomains": [], - "candidate_entities": [], - "candidate_apis": [], - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ] - }, - "confidence": 0.9500000000000001, - "routing_mode": "llm_default", - "llm_router_used": true, - "reason_short": "Запрос явно указывает на создание документации из существующего файла с анализом feature.", - "rag_session_id": "24bca5cf-5b10-41f6-838f-6928a618382d" -} -``` - -## process.v2.pipeline -```json -{ - "event": "router_resolved", - "domain": "DOCS", - "intent": "DOC_UPDATE", - "subintent": "FROM_FEATURE", - "confidence": 0.9500000000000001 -} -``` - -## process.v2.pipeline -```json -{ - "event": "anchors_extracted", - "signal_types": [ - "API_ENDPOINT", - "DOMAIN_ENTITY", - "LOGIC_FLOW" - ], - "endpoint_paths": [ - "/users/alex/dev_projects_v2/ai" - ], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ], - "matched_aliases": [], - "target_terms": [ - "/users/alex/dev_projects_v2/ai" - ] -} -``` - -## process.v2.pipeline -```json -{ - "event": "alias_resolution", - "resolved_aliases": [], - "target_doc_hints": [ - "/users/alex/dev_projects_v2/ai", - "users-alex-dev_projects_v2-ai", - "users-alex-dev_projects_v2-ai-endpoint", - "users-alex-dev_projects_v2-ai endpoint", - "ai", - "ai-endpoint", - "ai endpoint", - "docs/logic/telegram-notification-loop.md" - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_started", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "resolve_source", - "title": "Определение источника аналитики" - }, - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_source", - "title": "Загрузка системной аналитики" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "parse_feature", - "title": "Парсинг функциональных требований" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "load_doc_rules", - "title": "Загрузка doc_rules" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.plan_change_units", - "system_prompt": "Ты классифицируешь units системной аналитики для построения плана изменений документации.\n\nВерни только JSON:\n{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"coverage\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/coverage/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"reason\": \"...\"\n }\n ]\n}\n\nПравила:\n- Используй только doc_type из allowed_doc_types.\n- Не пропускай item, даже если не уверен: выбери наиболее близкий тип.\n- Ориентируйся на heading и snippet.\n- path — это служебное поле плана изменений, не поле frontmatter.\n- id:\n - брать из metadata unit, если задан;\n - если id нет, сгенерировать стабильный id по смыслу unit и по аналогии с существующей документацией.\n- имя файла всегда формировать строго как <id>.md.\n- для существующего документа (если это видно из контекста и индекса) путь не менять.\n- для нового документа путь формировать строго как docs/<application>/<platform>/<page_type>/<id>.md.\n- platform использовать только из допустимых значений: web, ufs, pprb.\n- page_type выбирать по doc_type (например ui_page -> ui, api_method -> api, logic_block -> logic).\n- последний сегмент path обязан совпадать с <id>.md.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"system_rules\": \"Системные правила документации:\\n1. Один устойчивый объект — один документ.\\n2. Документы не должны дублировать друг друга по смыслу.\\n3. Связи между документами должны быть явными (related_docs/links).\\n4. Документация организована иерархически по папкам docs/*.\\n5. Markdown-документ состоит из YAML frontmatter и body.\\n6. Обязательные поля frontmatter: id, title, doc_type, related_docs, status, domain, sub_domain.\",\n \"allowed_doc_types\": [\n \"ui_page\",\n \"api_method\",\n \"logic_block\",\n \"architecture_overview\",\n \"integration_doc\",\n \"domain_entity\",\n \"glossary_item\",\n \"index_page\"\n ],\n \"items\": [\n {\n \"index\": 0,\n \"heading\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"snippet\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\",\n \"known\": {\n \"type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\"\n }\n },\n {\n \"index\": 1,\n \"heading\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"snippet\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create. При отсутствии пермишена завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернут\",\n \"known\": {\n \"type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\"\n }\n }\n ]\n}", - "log_context": "workflow.v2.docs_update.from_feature.plan" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"items\": [\n {\n \"index\": 0,\n \"doc_type\": \"ui_page\",\n \"id\": \"ui.contacts_dgr.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"web\",\n \"page_type\": \"ui\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\"\n },\n {\n \"index\": 1,\n \"doc_type\": \"api_method\",\n \"id\": \"ufs.contacts_dgr.api.create\",\n \"application\": \"contacts_dgr\",\n \"platform\": \"ufs\",\n \"page_type\": \"api\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\"\n }\n ]\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_change_plan", - "title": "Построение плана изменений" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "ui_page", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "prompt_chars": 15882, - "rules_chars": 14400 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"doc_type\": \"ui_page\",\n \"doc_id\": \"ui.contacts_dgr.create\",\n \"title\": \"FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Основной сценарий:\\n- Пользователь заполняет атрибуты карточки и нажимает кнопку «Добавить».\\n- ui.contacts_dgr вызывает endpoint POST /api/v1/clients/contacts-dgr для создания карточки контакта ДГР.\\n- ufs.contacts_dgr обрабатывает запрос и возвращает ответ.\\n- ui.contacts_dgr отображает результат создания контакта ДГР в виде push-уведомления.\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n- Для документов с `doc_type: api_method` поле `endpoint` является обязательным.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (ui_page)\\n\\n# UI Page Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `ui_page`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одной пользовательской страницы, экрана или отдельного UI-сценария.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\n## Что описывать в Details\\n\\n- назначение страницы\\n- пользовательский сценарий\\n- основные блоки интерфейса\\n- связанные API и сущности\\n\\n## Template (ui_page)\\n\\n---\\nid: ui.example_page\\ntype: ui_page\\ndoc_type: ui_page\\nname: example_page\\ntitle: Пример UI-страницы\\nmodule: example_module\\nlayer: presentation\\ndomain: example_domain\\nsub_domain: example_subdomain\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: mixed\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# Пример UI-страницы\\n\\n## Summary\\n\\nКраткое описание страницы и её назначения.\\n\\n## Details\\n\\n### Назначение страницы\\n\\n### Пользовательский сценарий\\n\\n### Основные блоки интерфейса\\n\\n### Связанные API и сущности\\n\\n### Функциональные требования\\n\\n### Нефункциональные требования\\n\\n### Ограничения и граничные случаи\\n\\n### Ошибки и валидации\\n\\n### Связанный код\\n\\n### Связанные документы\\n\\n### История изменений\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: fr\\n\\n# Functional requrements rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять функциональные требования в подраздел `### Функциональные требования` в документах.\\n\\n## Правила\\n- Функциональное требование (FR) расширяет и дополняет шаги, описанные в сценарии.\\n- Функциональное требование (FR) не должно копировать шаг сценария не неся дополнительной информации.\\n- Название функционального требования формируется следующим образом - \\\"FR.<номер>. <Название>\\\", где \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий (от 3 до 7 слов)\\n\\n \\n\\n## Пример целевого описания сценария\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\\n\\n\\n ### Примеры описания FR\\nFR.1. Получение данных клиента из АС ЕПК\\n1. Сформировать запрос к эндпоинту POST /api/v1/path/to/resourse в АС ЕПК\\n - Заголовки\\n - <тут идет описание заголовков и того как они формируются>\\n - Параметры запроса\\n - <тут идет описание параметров и того как они формируются>\\n - Тело запроса\\n - <тут идет описание структуры объекта JSON или payload в другмо формате так как это задано требованиями>\\n\\n2. Обработать ответ от АС ЕПК\\n Успешный ответ - <взять из описания вызываеого api критерии успешного ответа >\\n Ничего не найдено - <взять из описания вызываеого api критерии успешного овтета, опционально (если применимо)>\\n Ошибка - <взять из описания вызываеого api критерии успешного ответа >\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\\n\\n## Section rule: tech-use-case\\n\\n# Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять технический USE CASE в подраздел `### Сценарий` в документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n- Основной и альтернативные сценарии состоят из шагов. \\n\\n- Каждый шаг описывается одним предложением не более 15-20 слов, и состоит из двух частей. Первая часть описывает что мы делаем по смыслу, чтобы это было понятно человеку без низкоуровневых технических деталей. Например: авторизует запрос, получает данные клиента, запрашивает справочники. Вторая часть описывает как это реализовано технически - вызывает эндпоинт /path/to/resource в системе <название системы>.\\n\\n- В описании шага не должно быть длинных технических деталей. Если техничсекую реализацию нельхзя описатьодним предложенеим (в лимите длины описания шага), то необхлодимо это вынести в отдельное функциональное требование FR.<номер>. <Название> и описать в нем технические детали. А в шаге сослаться на это требование через \\\"Описание приведено в FR.<номер>. <Название>\\\"\\n\\n- Для шагов авторизации обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с интеграцией обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с проверкой условий обязательны доп шаги с описанием переходов по сценарию.\\n\\n- Название \\\"FR.<номер>. <Название>\\\" формируется следующим образом: \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий.\\n\\n- Для каждого шага при необходимости нужно прописать логику действий в случае ошибки или если логика шага определяет несколько сценариев разивития при выполнении заданных условий. \\n\\n- Для шагов, которые описывают интеграцию с другой системой необходимо указать название точки интеграции (название эндпоинта, название топика и так далее) и сделать ссылку на FR.<номер>. <Название> с описанием шагов интеграции - как сформировать запрос/сообщение, как обработать ответ, политику ретраев.\\n\\n - Сценарий собирается из тезисов, приведенных системной аналимтике в свободной формулировке\\n\\n - Функциональные требования \\\"FR.<номер>. <Название>\\\" не должны дублировать шагов сценария в use case. Они содержат детали, которые вынесены из юзкейса чтобы не делать его тяжелым. Если шаг юзкейса описывается одним предложением в лимите длины, то FR делать не нужно.\\n\\n - FR обязательно описывается для шага с интеграцией\\n - FR Не описывается для шага авторизации.\\n\\n\\n\\n\\n\\n\\n## Пример целевого описания сценария\\n\\n### Примеры шагов сценария\\n\\nПример 1\\n- Авторизует запрос пользователя по наличию у него экшена ролевой модели CI02792632.ContactsDGR.Detail\\n - В случае ошибки - завершить сценарий с кодом UNAUTHORIZED\\n\\nПример 2\\n- Запрашивает данные клиента - вызывает /api/v1/clients/{client-id}/info\\n - В случае ошибки - завершить сценарий с кодом CLIENT_INFO_REQUEST_FAIL\\n\\nПример 3\\n- Возвращает ответ в формате <название DTO>\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"proposed_content\": \"---\\nid: ui.contacts_dgr.create\\ndoc_type: ui_page\\ntitle: Создание карточки контакта ДГР\\nmodule: contacts_dgr\\nlayer: presentation\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-05\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [UI, создание контакта]\\nentities: []\\nlinks: {}\\n---\\n\\n# Создание карточки контакта ДГР\\n\\n## Summary\\n\\n- Назначение: реализация функционала создания новой карточки контакта ДГР.\\n- Actor: пользователь системы.\\n- Trigger: заполнение формы создания контакта и нажатие кнопки «Добавить».\\n- Errors: возможные ошибки интеграции с backend-сервисами.\\n- Related API: POST /api/v1/clients/contacts-dgr.\\n\\n## Details\\n\\n### Назначение страницы\\nСтраница предназначена для создания новых карточек контактов ДГР пользователями системы.\\n\\n### Пользовательский сценарий\\nПользователь заполняет форму, система отправляет данные на сервер и уведомляет о результате операции.\\n\\n### Основные блоки интерфейса\\n- Форма ввода атрибутов контакта.\\n- Кнопка «Добавить» для отправки данных.\\n- Блок уведомления об успешности операции.\\n\\n### Связанные API и сущности\\nИнтеграция с ufs.contacts_dgr через API-эндпоинт POST /api/v1/clients/contacts-dgr.\\n\\n### Функциональные требования\\nFR-1: Отправка данных нового контакта ДГР в систему ufs.contacts_dgr.\\nFR-2: Отображение результата операции пользователю в виде push-уведомления.\\n\\n### Нефункциональные требования\\nNFR-1: Высокая доступность сервиса.\\nNFR-2: Защита данных пользователя.\\n\\n### Ограничения и граничные случаи\\nОграничения вводимых данных согласно требованиям системы ufs.contacts_dgr.\\n\\n### Ошибки и валидации\\nОбработка возможных ошибок API и уведомление пользователя.\\n\\n### Связанный код\\nНет.\\n\\n### Связанные документы\\nНет.\\n\\n### История изменений\\nПервая версия документа.\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "changeset_prompt_built", - "doc_type": "api_method", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "prompt_chars": 20119, - "rules_chars": 16054 -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "request", - "prompt_name": "v2_docs_update.build_doc_changeset", - "system_prompt": "Ты формируешь один item changeset для документации на основе системной аналитики и правил doc_rules.\n\nВерни только один JSON-объект (RFC8259) формата:\n{\n \"op\": \"create|update|delete\",\n \"path\": \"docs/...\",\n \"reason\": \"краткая причина\",\n \"proposed_content\": \"полный markdown документа для create/update\"\n}\n\nСхема и ограничения:\n- Обязательные поля всегда: op, path, reason.\n- Для op=create/update поле proposed_content обязательно и содержит полный markdown документа:\n 1) frontmatter между --- и ---,\n 2) затем body согласно doc_rules.\n- Для op=delete поле proposed_content запрещено.\n- В JSON используй двойные кавычки, без trailing commas.\n- Никаких code fences (```), комментариев и текста до/после JSON.\n\nПравила:\n- Строго соблюдай структуру и ограничения из doc_rules_context.\n- Для create/update верни полный итоговый markdown (frontmatter + body).\n- Для update не используй placeholder-тексты; возвращай пригодный к сохранению документ.\n- reason обязателен, короткий, по сути изменения.\n- Никакого markdown и текста вне JSON.", - "user_prompt": "{\n \"change_request\": {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"doc_type\": \"api_method\",\n \"doc_id\": \"ufs.contacts_dgr.api.create\",\n \"title\": \"FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"domain\": \"contacts_dgr\",\n \"sub_domain\": \"create_contact\",\n \"reason\": \"Из unit 'FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr' системной аналитики (test).\",\n \"source_refs\": [\n \"section: 5. Функциональные требования\"\n ],\n \"related_docs\": [],\n \"requirement_body\": \"Требования для основного сценария:\\n- Проверить входящий запрос на соответствие JSON-схеме. Если ошибка, завершить сценарий с кодом BAD_REQUEST.\\n- Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create. При отсутствии пермишена завершить основной сценарий с кодом UNAUTHORIZED.\\n- Для исполнения запроса на создание контакта вызвать endpoint POST /contacts в prpb.contacts_dgr.\\n- Вернуть ответ ui.contacts_dgr в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\nКонтракт POST /contacts\\n\\nЗапрос\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---|---|---|---|---|\\n| `X-Request-Id` | 1 | `uuid` | `header` | Сквозной идентификатор вызова |\\n| `X-Client-Ident-Id` | 1 | `string(50)` | `header` | Идентификатор системы потребителя |\\n| `X-Employee-Number` | 0..1 | `string(8)` | `header` | Табельный номер пользователя, вызвавшего сервис |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contact` | 1 | `object` | Данные контакта ДГР |\\n| `contact.lastName` | 0..1 | `string(100)` | Фамилия контакта |\\n| `contact.firstName` | 0..1 | `string(100)` | Имя контакта |\\n| `contact.middleName` | 0..1 | `string(100)` | Отчество контакта |\\n| `contact.name` | 0..1 | `string(100)` | Название группового контакта |\\n| `contact.description` | 0..1 | `string(1000)` | Описание группового контакта |\\n| `contact.position` | 0..1 | `string(100)` | Должность контакта у клиента |\\n| `contact.comment` | 0..1 | `string(1000)` | Комментарий к контакту |\\n| `contact.contactType` | 1 | `enum(string)` | `Individual`, `Group` |\\n| `contact.crossboarding` | 1 | `boolean` | Признак принадлежности контакта к процессу онбординга |\\n| `contact.createdBy` | 1 | `string(8)` | Табельный номер пользователя, создавшего контакт |\\n| `contact.emails` | 0..1 | `array(object)` | Массив электронных адресов контакта |\\n| `contact.emails.value` | 1 | `string(100)` | Электронный адрес |\\n| `contact.emails.main` | 1 | `boolean` | Признак основной почты |\\n| `contact.phones` | 0..1 | `array(object)` | Массив телефонных номеров контакта |\\n| `contact.phones.value` | 1 | `string(20)` | Телефонный номер контакта |\\n| `contact.phones.extValue` | 0..1 | `string(10)` | Добавочный номер |\\n| `contact.phones.main` | 1 | `boolean` | Признак основного телефона |\\n| `contact.phones.mobile` | 1 | `boolean` | Признак мобильного телефона |\\n| `client` | 1 | `object` | Данные клиента |\\n| `client.ucpId` | 0..1 | `string(36)` | Идентификатор клиента ПАО |\\n| `client.sbpId` | 0..1 | `string(36)` | Идентификатор клиента АО |\\n| `client.inn` | 0..1 | `string(12)` | ИНН клиента |\\n| `client.kpp` | 0..1 | `string(9)` | КПП клиента |\\n\\nОтвет\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|---|---|---|---|\\n| `contactId` | 1 | `string(36)` | Идентификатор контакта |\"\n },\n \"doc_rules_context\": \"## Global rules\\n\\n### documentation-rules.md\\n\\n# Documentation Rules\\n\\nЭтот каталог оформляет MVP документации проекта в атомарном формате.\\n\\n## Базовая структура\\n\\n- Каждый документ содержит YAML frontmatter.\\n- В документе должен быть один `H1`, совпадающий с `title`.\\n- Основные разделы оформляются как `## Summary` и `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`.\\n\\n## Summary\\n\\n- Краткий explain-слой быстрого контекста.\\n- Должен позволять быстро понять назначение документа без чтения `Details`.\\n- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев.\\n\\n## Details\\n\\n- Раскрывает полное описание объекта.\\n- Структура `Details` зависит от типа документа.\\n- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам.\\n\\n## API documents\\n\\nДля `api_method` внутри `## Details` обязательны разделы:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\nЕсли у метода есть интеграции и ошибки, также обязательны:\\n- `### Интеграции`\\n- `### Ошибки`\\n- `### Связанный код`\\n- `### История изменений`\\n\\n### Сценарий\\n\\nСценарий оформляется как технический use case и содержит:\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработку ошибок\\n- постусловие\\n\\n### Требования\\n\\n- Функциональные требования маркируются как `FR-1`, `FR-2`, ...\\n- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ...\\n- Идентификаторы требований локальны в рамках одного документа.\\n\\n### Контракт\\n\\nКонтракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать:\\n- входные параметры\\n- выходные параметры\\n- структуру JSON-сообщений\\n- обязательность полей\\n- типы и ограничения\\n- описание полей\\n- правила заполнения\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n### global/documentation-system.md\\n\\n# Documentation System\\n\\n## Назначение\\n\\nЭтот файл задает общую модель документации проекта.\\n\\n## Базовая модель\\n\\nКаждый документ должен состоять из двух слоев:\\n- YAML frontmatter\\n- контент\\n\\nКонтент всегда состоит из двух обязательных разделов:\\n- `## Summary`\\n- `## Details`\\n\\nНад ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter.\\n\\n## Принципы\\n\\n- Документы должны быть атомарными.\\n- Один документ описывает одну тему.\\n- Вместо дублирования между документами используются явные ссылки.\\n- Связи и навигация должны быть формализованы.\\n- Документы должны быть пригодны для чтения человеком и для RAG.\\n- Документы должны быть пригодны для частичного обновления без деградации структуры.\\n\\n## Типы документов\\n\\nНа уровне проекта поддерживаются типы:\\n- `api_method`\\n- `logic_block`\\n- `architecture_overview`\\n- `domain_entity`\\n- `ui_page`\\n- `integration_doc`\\n- `index_page`\\n- `glossary_item`\\n\\n### global/frontmatter.md\\n\\n# Frontmatter Rules\\n\\n## Назначение\\n\\nЭтот файл описывает единый контракт YAML frontmatter для всех документов.\\n\\n## Обязательные поля\\n\\n```yaml\\nid: string\\ntitle: string\\ndoc_type: string\\ndomain: string\\nsub_domain: string\\nrelated_docs: []\\nstatus: string\\n```\\n\\n## Поля совместимости и рекомендуемые поля\\n\\n```yaml\\ntype: string\\nname: string\\nmodule: string\\nlayer: string\\nupdated_at: YYYY-MM-DD\\ntags: []\\nentities: []\\nparent: string | null\\nchildren: []\\nlinks: {}\\nsource_of_truth: string\\nrelated_code: []\\nsystem_analytics_refs: []\\n```\\n\\n## Правила\\n\\n- `id` должен быть стабильным и уникальным в пределах документации проекта.\\n- `title` — человекочитаемый заголовок.\\n- `doc_type` — канонический тип документа.\\n- `domain` и `sub_domain` определяют бизнес-контекст документа.\\n- `related_docs` хранит явные связи с другими markdown-документами.\\n- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`.\\n- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами.\\n- `name` — короткое системное имя документа.\\n- `module` — модуль или подсистема.\\n- `layer` — слой системы.\\n- `updated_at` хранится в формате `YYYY-MM-DD`.\\n- Для документов с `doc_type: api_method` поле `endpoint` является обязательным.\\n\\n## Связи и навигация\\n\\n- `entities` описывает сущности, связанные с документом.\\n- `parent` и `children` описывают иерархию.\\n- `links` описывает typed graph связей между документами, кодом и интеграциями.\\n\\n## Формат links\\n\\n```yaml\\nlinks:\\n called_by:\\n - ext.health_probe\\n uses_logic:\\n - logic.some_flow\\n integrates_with:\\n - ext.some_system\\n```\\n\\n### global/linking.md\\n\\n# Linking Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как связывать документы между собой.\\n\\n## Иерархия\\n\\n- `parent` используется для родительского документа.\\n- `children` используется для прямых дочерних документов.\\n- Иерархия должна быть осмысленной и стабильной.\\n- Для общей точки входа допустим `index_page`.\\n\\n## Графовые связи\\n\\nДля `related_docs` используются ссылки на соседние документы.\\n\\nДля `links` рекомендуется использовать typed-ключи:\\n- `called_by`\\n- `uses_logic`\\n- `reads_db`\\n- `writes_db`\\n- `integrates_with`\\n- `used_by`\\n- `exposes_api`\\n- `uses_entities`\\n\\n## Правила использования\\n\\n- Если документ логически входит в другой, использовать `parent`/`children`.\\n- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`.\\n- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`.\\n- Детальное описание интеграций хранить в body документа, а не только во frontmatter.\\n\\n### global/naming.md\\n\\n# Naming Rules\\n\\n## Назначение\\n\\nЭтот файл описывает правила именования документов, файлов и идентификаторов.\\n\\n## Правила для файлов\\n\\n- Имена файлов должны быть в kebab-case.\\n- Имя файла должно отражать одну тему.\\n- Для шаблонов использовать суффикс `.template.md`.\\n\\n## Правила для id\\n\\n- `id` строится в формате `<type-group>.<name>`.\\n- Примеры:\\n - `api.send_message_endpoint`\\n - `logic.telegram_notification_loop`\\n - `architecture.telegram_notify_app`\\n\\n## Правила для title\\n\\n- `title` должен быть кратким и человекочитаемым.\\n- В `title` допускаются пробелы и естественный язык.\\n\\n### global/writing-style.md\\n\\n# Writing Style\\n\\n## Назначение\\n\\nЭтот файл задает правила стиля для текстового наполнения документации.\\n\\n## Правила стиля\\n\\n- Текст должен быть лаконичным.\\n- Формулировки должны быть точными и техническими.\\n- Summary должен быть кратким explain-слоем.\\n- Details должен раскрывать суть без лишней воды.\\n- Нежелательно смешивать несколько тем в одном документе.\\n- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ.\\n\\n## Язык\\n\\n- Основной язык документации — русский.\\n- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском.\\n\\n## Artifact rules (api_method)\\n\\n# API Method Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для документов типа `api_method`.\\n\\n## Когда использовать\\n\\nИспользовать для описания одного HTTP endpoint или одного отдельного API метода.\\n\\n## Обязательная структура\\n\\nДокумент должен содержать:\\n- YAML frontmatter\\n- `# <title>`\\n- `## Summary`\\n- `## Details`\\n\\nВнутри `## Details` обязательны:\\n- `### Описание`\\n- `### Сценарий`\\n- `### Функциональные требования`\\n- `### Нефункциональные требования`\\n- `### Контракт`\\n\\n## Особые правила\\n\\n- Во frontmatter обязательно указывать `endpoint` (например: `POST /api/v1/clients/contacts-dgr`).\\n- Сценарий оформляется как технический use case.\\n- Функциональные требования маркируются `FR-*`.\\n- Нефункциональные требования маркируются `NFR-*`.\\n- Контракт должен быть пригоден для последующей сборки OpenAPI.\\n- Если у метода есть интеграции, они выносятся в `### Интеграции`.\\n- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок.\\n\\n## Ошибки оформления\\n\\n- Нельзя заменять контракт общим текстовым описанием.\\n- Нельзя смешивать несколько endpoint в одном документе.\\n- Нельзя хранить связи и навигацию вне frontmatter.\\n\\n## Template (api_method)\\n\\n---\\nid: api.example_method\\ntype: api_method\\ndoc_type: api_method\\nname: example_method\\ntitle: HTTP API /example\\nmodule: example_module\\nlayer: application\\ndomain: example_domain\\nsub_domain: example_subdomain\\nendpoint: POST /api/v1/example\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2026-03-20\\nsource_of_truth: code\\nparent: null\\nchildren: []\\ntags: []\\nentities: []\\nlinks: {}\\n---\\n\\n# HTTP API /example\\n\\n## Summary\\n\\nКраткое описание метода.\\n\\n## Details\\n\\n## Описание\\n\\nКороткое описание сути метода.\\n\\n## Сценарий\\n\\n**Название:**\\n\\n**Предусловия:**\\n- \\n\\n**Триггер:**\\n- \\n\\n**Основной сценарий:**\\n1. \\n\\n**Альтернативный сценарий:**\\n1. \\n\\n**Обработка ошибок:**\\n1. \\n\\n**Постусловие:**\\n- \\n\\n## Функциональные требования\\n\\n**FR-1.**\\n\\n## Нефункциональные требования\\n\\n**NFR-1.**\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример |\\n|---|---|---|---|---|---|---|\\n| | | | | | | |\\n\\n### Интеграции\\n\\n### Ошибки\\n\\n### Связанный код\\n\\n### История изменений\\n\\n## Section rule: api-contract\\n\\n# API Contract Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять подраздел `## Контракт` в API-документах.\\n\\n## Что должно быть описано\\n\\n- входные параметры\\n- выходные параметры\\n- JSON-структуры запросов и ответов\\n- обязательность полей\\n- типы полей\\n- ограничения\\n- описание назначения полей\\n- примеры данных\\n- auth\\n- idempotency\\n- timeout\\n- ошибки и их HTTP-коды\\n\\n## Правило качества\\n\\nКонтракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию.\\n\\n## Section rule: details\\n\\n# Details Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает общие правила для секции `## Details`.\\n\\n## Правила\\n\\n- `Details` оформляется как `## Details`.\\n- Внутри `Details` используются заголовки уровня `###` и ниже.\\n- Структура Details зависит от типа документа.\\n- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter.\\n- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа.\\n\\n## Section rule: fr\\n\\n# Functional requrements rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять функциональные требования в подраздел `### Функциональные требования` в документах.\\n\\n## Правила\\n- Функциональное требование (FR) расширяет и дополняет шаги, описанные в сценарии.\\n- Функциональное требование (FR) не должно копировать шаг сценария не неся дополнительной информации.\\n- Название функционального требования формируется следующим образом - \\\"FR.<номер>. <Название>\\\", где \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий (от 3 до 7 слов)\\n\\n \\n\\n## Пример целевого описания сценария\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\\n\\n\\n ### Примеры описания FR\\nFR.1. Получение данных клиента из АС ЕПК\\n1. Сформировать запрос к эндпоинту POST /api/v1/path/to/resourse в АС ЕПК\\n - Заголовки\\n - <тут идет описание заголовков и того как они формируются>\\n - Параметры запроса\\n - <тут идет описание параметров и того как они формируются>\\n - Тело запроса\\n - <тут идет описание структуры объекта JSON или payload в другмо формате так как это задано требованиями>\\n\\n2. Обработать ответ от АС ЕПК\\n Успешный ответ - <взять из описания вызываеого api критерии успешного ответа >\\n Ничего не найдено - <взять из описания вызываеого api критерии успешного овтета, опционально (если применимо)>\\n Ошибка - <взять из описания вызываеого api критерии успешного ответа >\\n\\n## Section rule: requirements-format\\n\\n# Requirements Format Rules\\n\\n## Назначение\\n\\nЭтот файл задает формат для функциональных и нефункциональных требований.\\n\\n## Функциональные требования\\n\\n- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее.\\n- Каждое требование должно описывать отдельный обязательный аспект поведения.\\n- Идентификаторы локальны в пределах одного документа.\\n\\n## Нефункциональные требования\\n\\n- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее.\\n- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства.\\n\\n## Section rule: summary\\n\\n# Summary Section Rules\\n\\n## Назначение\\n\\nЭтот файл задает правила для секции `## Summary`.\\n\\n## Правила\\n\\n- Summary должен быть коротким explain-слоем быстрого контекста.\\n- Summary должен объяснять суть документа без лишних деталей.\\n- Summary должен быть пригоден для explain и быстрого чтения.\\n- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д.\\n- Для крупных документов допустим более длинный summary, если он остается структурированным.\\n\\n## Section rule: tech-use-case\\n\\n# Scenario Rules\\n\\n## Назначение\\n\\nЭтот файл описывает, как оформлять технический USE CASE в подраздел `### Сценарий` в документах.\\n\\n## Обязательные части\\n\\n- название\\n- предусловия\\n- триггер\\n- основной сценарий\\n- альтернативный сценарий\\n- обработка ошибок\\n- постусловие\\n\\n## Правила\\n- Основной и альтернативные сценарии состоят из шагов. \\n\\n- Каждый шаг описывается одним предложением не более 15-20 слов, и состоит из двух частей. Первая часть описывает что мы делаем по смыслу, чтобы это было понятно человеку без низкоуровневых технических деталей. Например: авторизует запрос, получает данные клиента, запрашивает справочники. Вторая часть описывает как это реализовано технически - вызывает эндпоинт /path/to/resource в системе <название системы>.\\n\\n- В описании шага не должно быть длинных технических деталей. Если техничсекую реализацию нельхзя описатьодним предложенеим (в лимите длины описания шага), то необхлодимо это вынести в отдельное функциональное требование FR.<номер>. <Название> и описать в нем технические детали. А в шаге сослаться на это требование через \\\"Описание приведено в FR.<номер>. <Название>\\\"\\n\\n- Для шагов авторизации обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с интеграцией обязателен доп шаг с описанием обработки ошибки.\\n- Для шагов с проверкой условий обязательны доп шаги с описанием переходов по сценарию.\\n\\n- Название \\\"FR.<номер>. <Название>\\\" формируется следующим образом: \\n - <номер> идет инкрементально внутри конкретного документа, начинается с 1.\\n - <Название> - кратко описывает что делает требование, суть действий.\\n\\n- Для каждого шага при необходимости нужно прописать логику действий в случае ошибки или если логика шага определяет несколько сценариев разивития при выполнении заданных условий. \\n\\n- Для шагов, которые описывают интеграцию с другой системой необходимо указать название точки интеграции (название эндпоинта, название топика и так далее) и сделать ссылку на FR.<номер>. <Название> с описанием шагов интеграции - как сформировать запрос/сообщение, как обработать ответ, политику ретраев.\\n\\n - Сценарий собирается из тезисов, приведенных системной аналимтике в свободной формулировке\\n\\n - Функциональные требования \\\"FR.<номер>. <Название>\\\" не должны дублировать шагов сценария в use case. Они содержат детали, которые вынесены из юзкейса чтобы не делать его тяжелым. Если шаг юзкейса описывается одним предложением в лимите длины, то FR делать не нужно.\\n\\n - FR обязательно описывается для шага с интеграцией\\n - FR Не описывается для шага авторизации.\\n\\n\\n\\n\\n\\n\\n## Пример целевого описания сценария\\n\\n### Примеры шагов сценария\\n\\nПример 1\\n- Авторизует запрос пользователя по наличию у него экшена ролевой модели CI02792632.ContactsDGR.Detail\\n - В случае ошибки - завершить сценарий с кодом UNAUTHORIZED\\n\\nПример 2\\n- Запрашивает данные клиента - вызывает /api/v1/clients/{client-id}/info\\n - В случае ошибки - завершить сценарий с кодом CLIENT_INFO_REQUEST_FAIL\\n\\nПример 3\\n- Возвращает ответ в формате <название DTO>\\n\\n### Примеры названия FR\\n - Получение данных клиента из АС ЕПК\\n - Проверка уровня доступа\\n - Сценарий построения списка связанных предложений\"\n}", - "log_context": "workflow.v2.docs_update.from_feature.changeset" -} -``` - -## workflow.v2.docs_update.from_feature.llm -```json -{ - "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr_api_create.md\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта ДГР через POST /api/v1/clients/contacts-dgr\",\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ntype: api_method\\ndoc_type: api_method\\nname: create_contacts_dgr\\nmodule: clients\\ndomain: contacts_dgr\\nsub_domain: create_contact\\ntitle: Создание контакта ДГР через API\\nendpoint: POST /api/v1/clients/contacts-dgr\\nstatus: draft\\nupdated_at: 2023-10-10\\nsource_of_truth: system_analytics\\nsystem_analytics_refs: [\\\"section: 5. Функциональные требования\\\"]\\n---\\n\\n# Создание контакта ДГР через API\\n\\n## Summary\\n\\nМетод предназначен для создания контакта ДГР в системе клиентов.\\n\\n**Purpose**: Создание нового контакта ДГР.\\n**Actors**: Клиенты, пользователи с правами CI02792632.ContactsDGR.Create.\\n**Trigger**: POST-запрос на `/api/v1/clients/contacts-dgr`.\\n**Errors**: BAD_REQUEST, UNAUTHORIZED.\\n\\n## Details\\n\\n## Описание\\n\\nAPI-метод позволяет создавать контактные записи ДГР для клиентов через HTTP-запрос POST к `/api/v1/clients/contacts-dgr`.\\n\\n## Сценарий\\n\\n**Название:** Создание контакта ДГР\\n\\n**Предусловия:**\\n- Пользователь аутентифицирован и имеет доступ к ресурсу.\\n\\n**Триггер:**\\n- Приходит POST-запрос на `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность входящего запроса согласно JSON-схеме.\\n2. Производится проверка наличия пермишена CI02792632.ContactsDGR.Create.\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n4. Формируется и возвращается ответ клиенту в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\n- При ошибке проверки схемы запроса происходит завершение сценария с кодом BAD_REQUEST.\\n- При отсутствии необходимого пермишена завершается сценарий с кодом UNAUTHORIZED.\\n\\n**Обработка ошибок:**\\n- В случае ошибки интеграции с prpb.contacts_dgr сценарий завершает работу с соответствующим кодом ошибки.\\n\\n**Постусловие:**\\n- Создан новый контакт ДГР в системе клиентов.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверка входящего запроса на соответствие JSON-схеме.\\n**FR-2.** Авторизация запроса по наличию пермишена CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызов endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n**FR-4.** Формирование и возврат ответа в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Нефункциональные требования\\n\\n(NFR здесь отсутствуют)\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---------------------|---------------|-------------|----------------|-------------------------------------|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|-----------------------|---------------|------------------|---------------------------------------|\\n| contact | 1 | object | Данные контакта ДГР |\\n| contact.lastName | 0..1 | string(100) | Фамилия контакта |\\n| contact.firstName | 0..1 | string(100) | Имя контакта |\\n| contact.middleName | 0..1 | string(100) | Отчество контакта |\\n| contact.name | 0..1 | string(100) | Название группового контакта |\\n| contact.description | 0..1 | string(1000) | Описание группового контакта |\\n| contact.position | 0..1 | string(100) | Должность контакта у клиента |\\n| contact.comment | 0..1 | string(1000) | Комментарий к контакту |\\n| contact.contactType | 1 | enum(string) | Индивидуальный или групповой контакт |\\n| contact.crossboarding | 1 | boolean | Признак принадлежности к онбордингу |\\n| contact.createdBy | 1 | string(8) | Табельный номер создателя контакта |\\n| contact.emails | 0..1 | array(object) | Массив электронных адресов |\\n| contact.emails.value | 1 | string(100) | Электронный адрес |\\n| contact.emails.main | 1 | boolean | Признак основной почты |\\n| contact.phones | 0..1 | array(object) | Массив телефонных номеров |\\n| contact.phones.value | 1 | string(20) | Телефонный номер контакта |\\n| contact.phones.extValue| 0..1 | string(10) | Добавочный номер |\\n| contact.phones.main | 1 | boolean | Признак основного телефона |\\n| contact.phones.mobile | 1 | boolean | Признак мобильного телефона |\\n| client | 1 | object | Данные клиента |\\n| client.ucpId | 0..1 | string(36) | Идентификатор клиента ПАО |\\n| client.sbpId | 0..1 | string(36) | Идентификатор клиента АО |\\n| client.inn | 0..1 | string(12) | ИНН клиента |\\n| client.kpp | 0..1 | string(9) | КПП клиента |\\n\\n### Выходные параметры\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|------------|---------------|-----------|-------------------------|\\n| contactId | 1 | string(36)| Идентификатор контакта |\\n\"\n}" -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "build_changeset", - "title": "Формирование changeset" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_step_traced", - "workflow_id": "v2.docs_update.from_feature", - "step": { - "id": "finalize", - "title": "Подготовка ответа" - }, - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 8465, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 8465, - "issues_count": 0, - "issues_preview": [] - } - } -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_trace_flushed", - "workflow_id": "v2.docs_update.from_feature", - "steps": [ - { - "step_id": "resolve_source", - "title": "Определение источника аналитики", - "input": { - "source_kind": "", - "source_ref": "", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_source", - "title": "Загрузка системной аналитики", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "", - "feature_content_len": 0, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "source_kind": "markdown_file", - "content_loaded": true, - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "parse_feature", - "title": "Парсинг функциональных требований", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "", - "application": "", - "platform": "", - "domains": [], - "subdomains": [], - "units_count": 0, - "unit_headings": [], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "load_doc_rules", - "title": "Загрузка doc_rules", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": false, - "doc_rules_supported_types": [], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "enabled": true, - "loaded": true, - "supported_doc_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_change_plan", - "title": "Построение плана изменений", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 0, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 0, - "planned_changes_preview": [], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "docs_rows": 7, - "planned_changes": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "build_changeset", - "title": "Формирование changeset", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 0, - "changeset_preview": [], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "changeset_items": 2, - "issues": 0, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - } - } - }, - { - "step_id": "finalize", - "title": "Подготовка ответа", - "input": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": false, - "answer_len": 0, - "issues_count": 0, - "issues_preview": [] - }, - "output": { - "answer_length": 8465, - "issues": 0, - "changeset_items": 2, - "_context": { - "source_kind": "markdown_file", - "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", - "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", - "feature_content_len": 6250, - "analysis_id": "test", - "application": "contacts_dgr", - "platform": "web", - "domains": [ - "contacts_dgr" - ], - "subdomains": [ - "create_contact" - ], - "units_count": 2, - "unit_headings": [ - "FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»", - "FR2. Реализовать сервис CLIENTS. POST /api/v1/clients/contacts-dgr" - ], - "docs_rows_count": 7, - "doc_rules_enabled": true, - "doc_rules_loaded": true, - "doc_rules_supported_types": [ - "api_method", - "architecture_overview", - "domain_entity", - "logic_block", - "ui_page" - ], - "planned_changes_count": 2, - "planned_changes_preview": [ - { - "op": "create", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md", - "doc_type": "ui_page" - }, - { - "op": "create", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md", - "doc_type": "api_method" - } - ], - "changeset_count": 2, - "changeset_preview": [ - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md" - }, - { - "op": "ChangeOp.CREATE", - "path": "docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md" - } - ], - "apply_changeset": true, - "answer_len": 8465, - "issues_count": 0, - "issues_preview": [] - } - } - } - ] -} -``` - -## workflow.v2.docs_update.from_feature -```json -{ - "event": "workflow_completed", - "workflow_id": "v2.docs_update.from_feature" -} -``` - -## process.v2.pipeline -```json -{ - "event": "answer_generated", - "answer_mode": "docs_update_changeset", - "answer_length": 8465, - "changeset_items": 2, - "apply_changeset": true -} -``` - -## result -```json -{ - "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nПлан изменений:\n- create: docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md (ui_page)\n- create: docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ui.contacts_dgr.create\\ndoc_type: ui_page\\ntitle: Создание карточки контакта ДГР\\nmodule: contacts_dgr\\nlayer: presentation\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-05\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [UI, создание контакта]\\nentities: []\\nlinks: {}\\n---\\n\\n# Создание карточки контакта ДГР\\n\\n## Summary\\n\\n- Назначение: реализация функционала создания новой карточки контакта ДГР.\\n- Actor: пользователь системы.\\n- Trigger: заполнение формы создания контакта и нажатие кнопки «Добавить».\\n- Errors: возможные ошибки интеграции с backend-сервисами.\\n- Related API: POST /api/v1/clients/contacts-dgr.\\n\\n## Details\\n\\n### Назначение страницы\\nСтраница предназначена для создания новых карточек контактов ДГР пользователями системы.\\n\\n### Пользовательский сценарий\\nПользователь заполняет форму, система отправляет данные на сервер и уведомляет о результате операции.\\n\\n### Основные блоки интерфейса\\n- Форма ввода атрибутов контакта.\\n- Кнопка «Добавить» для отправки данных.\\n- Блок уведомления об успешности операции.\\n\\n### Связанные API и сущности\\nИнтеграция с ufs.contacts_dgr через API-эндпоинт POST /api/v1/clients/contacts-dgr.\\n\\n### Функциональные требования\\nFR-1: Отправка данных нового контакта ДГР в систему ufs.contacts_dgr.\\nFR-2: Отображение результата операции пользователю в виде push-уведомления.\\n\\n### Нефункциональные требования\\nNFR-1: Высокая доступность сервиса.\\nNFR-2: Защита данных пользователя.\\n\\n### Ограничения и граничные случаи\\nОграничения вводимых данных согласно требованиям системы ufs.contacts_dgr.\\n\\n### Ошибки и валидации\\nОбработка возможных ошибок API и уведомление пользователя.\\n\\n### Связанный код\\nНет.\\n\\n### Связанные документы\\nНет.\\n\\n### История изменений\\nПервая версия документа.\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ntype: api_method\\ndoc_type: api_method\\nname: create_contacts_dgr\\nmodule: clients\\ndomain: contacts_dgr\\nsub_domain: create_contact\\ntitle: Создание контакта ДГР через API\\nendpoint: POST /api/v1/clients/contacts-dgr\\nstatus: draft\\nupdated_at: 2023-10-10\\nsource_of_truth: system_analytics\\nsystem_analytics_refs: [\\\"section: 5. Функциональные требования\\\"]\\n---\\n\\n# Создание контакта ДГР через API\\n\\n## Summary\\n\\nМетод предназначен для создания контакта ДГР в системе клиентов.\\n\\n**Purpose**: Создание нового контакта ДГР.\\n**Actors**: Клиенты, пользователи с правами CI02792632.ContactsDGR.Create.\\n**Trigger**: POST-запрос на `/api/v1/clients/contacts-dgr`.\\n**Errors**: BAD_REQUEST, UNAUTHORIZED.\\n\\n## Details\\n\\n## Описание\\n\\nAPI-метод позволяет создавать контактные записи ДГР для клиентов через HTTP-запрос POST к `/api/v1/clients/contacts-dgr`.\\n\\n## Сценарий\\n\\n**Название:** Создание контакта ДГР\\n\\n**Предусловия:**\\n- Пользователь аутентифицирован и имеет доступ к ресурсу.\\n\\n**Триггер:**\\n- Приходит POST-запрос на `/api/v1/clients/contacts-dgr`.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность входящего запроса согласно JSON-схеме.\\n2. Производится проверка наличия пермишена CI02792632.ContactsDGR.Create.\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n4. Формируется и возвращается ответ клиенту в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\n- При ошибке проверки схемы запроса происходит завершение сценария с кодом BAD_REQUEST.\\n- При отсутствии необходимого пермишена завершается сценарий с кодом UNAUTHORIZED.\\n\\n**Обработка ошибок:**\\n- В случае ошибки интеграции с prpb.contacts_dgr сценарий завершает работу с соответствующим кодом ошибки.\\n\\n**Постусловие:**\\n- Создан новый контакт ДГР в системе клиентов.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверка входящего запроса на соответствие JSON-схеме.\\n**FR-2.** Авторизация запроса по наличию пермишена CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызов endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n**FR-4.** Формирование и возврат ответа в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Нефункциональные требования\\n\\n(NFR здесь отсутствуют)\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n**headers**\\n\\n| Атрибут | Обязательность | Тип | Где передаем | Описание |\\n|---------------------|---------------|-------------|----------------|-------------------------------------|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя |\\n\\n**body**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|-----------------------|---------------|------------------|---------------------------------------|\\n| contact | 1 | object | Данные контакта ДГР |\\n| contact.lastName | 0..1 | string(100) | Фамилия контакта |\\n| contact.firstName | 0..1 | string(100) | Имя контакта |\\n| contact.middleName | 0..1 | string(100) | Отчество контакта |\\n| contact.name | 0..1 | string(100) | Название группового контакта |\\n| contact.description | 0..1 | string(1000) | Описание группового контакта |\\n| contact.position | 0..1 | string(100) | Должность контакта у клиента |\\n| contact.comment | 0..1 | string(1000) | Комментарий к контакту |\\n| contact.contactType | 1 | enum(string) | Индивидуальный или групповой контакт |\\n| contact.crossboarding | 1 | boolean | Признак принадлежности к онбордингу |\\n| contact.createdBy | 1 | string(8) | Табельный номер создателя контакта |\\n| contact.emails | 0..1 | array(object) | Массив электронных адресов |\\n| contact.emails.value | 1 | string(100) | Электронный адрес |\\n| contact.emails.main | 1 | boolean | Признак основной почты |\\n| contact.phones | 0..1 | array(object) | Массив телефонных номеров |\\n| contact.phones.value | 1 | string(20) | Телефонный номер контакта |\\n| contact.phones.extValue| 0..1 | string(10) | Добавочный номер |\\n| contact.phones.main | 1 | boolean | Признак основного телефона |\\n| contact.phones.mobile | 1 | boolean | Признак мобильного телефона |\\n| client | 1 | object | Данные клиента |\\n| client.ucpId | 0..1 | string(36) | Идентификатор клиента ПАО |\\n| client.sbpId | 0..1 | string(36) | Идентификатор клиента АО |\\n| client.inn | 0..1 | string(12) | ИНН клиента |\\n| client.kpp | 0..1 | string(9) | КПП клиента |\\n\\n### Выходные параметры\\n\\n**ContactDGRCreateRsDto**\\n\\n| Атрибут | Обязательность | Тип | Описание |\\n|------------|---------------|-----------|-------------------------|\\n| contactId | 1 | string(36)| Идентификатор контакта |\\n\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта ДГР через POST /api/v1/clients/contacts-dgr\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-10T12:02:32.543441+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260410-121449-0ddfbe598bd9.md b/runtime_traces/agent_requests/20260410-130611-31bb5d20c67b.md similarity index 90% rename from runtime_traces/agent_requests/20260410-121449-0ddfbe598bd9.md rename to runtime_traces/agent_requests/20260410-130611-31bb5d20c67b.md index 9fcc814..6963191 100644 --- a/runtime_traces/agent_requests/20260410-121449-0ddfbe598bd9.md +++ b/runtime_traces/agent_requests/20260410-130611-31bb5d20c67b.md @@ -1,16 +1,16 @@ -# Runtime Trace: 20260410-121449-0ddfbe598bd9 +# Runtime Trace: 20260410-130611-31bb5d20c67b -- active_rag_session_id: 87655eaf-302b-409d-946c-0ddfbe598bd9 +- active_rag_session_id: 0ae059fe-076a-4aa4-abd4-31bb5d20c67b ## request ```json { - "request_id": "req_299f353019a2465e84c88909c8903a31", - "session_id": "as_31564e5fcf6e4048b5cb0496f53b8fee", - "active_rag_session_id": "87655eaf-302b-409d-946c-0ddfbe598bd9", + "request_id": "req_a14d483fd13b44fa98eb81dd6dd3ccdc", + "session_id": "as_90d274870b1247d19694bbef1afa389a", + "active_rag_session_id": "0ae059fe-076a-4aa4-abd4-31bb5d20c67b", "process_version": "v2", - "created_at": "2026-04-10T12:14:49.260081+00:00", - "message": "Какие методы апи есть в проекте?" + "created_at": "2026-04-10T13:06:11.385561+00:00", + "message": "Какие методы апи есть в проекте" } ``` @@ -21,7 +21,7 @@ "routing_domain": "DOCS", "intent": "DOC_EXPLAIN", "subintent": "API_EXPOSED", - "normalized_query": "Какие методы апи есть в проекте?", + "normalized_query": "Какие методы апи есть в проекте", "target_terms": [], "anchors": { "entity_names": [], @@ -41,8 +41,8 @@ "confidence": 0.8500000000000001, "routing_mode": "llm_default", "llm_router_used": true, - "reason_short": "Запрос явно касается списка доступных API-методов.", - "rag_session_id": "87655eaf-302b-409d-946c-0ddfbe598bd9" + "reason_short": "Запрос явно касается перечисления доступных API-методов.", + "rag_session_id": "0ae059fe-076a-4aa4-abd4-31bb5d20c67b" } ``` @@ -322,6 +322,6 @@ { "status": "done", "answer": "GET /api/v1/clients/contacts-dgr\nGET /api/v1/clients/contacts-dgr/{contactid}\nPOST /api/v1/clients/contacts-dgr", - "completed_at": "2026-04-10T12:14:51.286117+00:00" + "completed_at": "2026-04-10T13:06:13.326341+00:00" } ``` diff --git a/runtime_traces/agent_requests/20260410-121324-7cbccb7c5840.md b/runtime_traces/agent_requests/20260410-131717-21b9ef59fe19.md similarity index 83% rename from runtime_traces/agent_requests/20260410-121324-7cbccb7c5840.md rename to runtime_traces/agent_requests/20260410-131717-21b9ef59fe19.md index 6138ad0..076be63 100644 --- a/runtime_traces/agent_requests/20260410-121324-7cbccb7c5840.md +++ b/runtime_traces/agent_requests/20260410-131717-21b9ef59fe19.md @@ -1,15 +1,15 @@ -# Runtime Trace: 20260410-121324-7cbccb7c5840 +# Runtime Trace: 20260410-131717-21b9ef59fe19 -- active_rag_session_id: 79ac0f0b-72a3-4b0a-8251-7cbccb7c5840 +- active_rag_session_id: 199e3b54-8cd7-4c9b-b745-21b9ef59fe19 ## request ```json { - "request_id": "req_710c8f2449fd4979a9faafc39b67f0b4", - "session_id": "as_340d7bd4e4ef4c59b5c381c51779fd34", - "active_rag_session_id": "79ac0f0b-72a3-4b0a-8251-7cbccb7c5840", + "request_id": "req_a8243a0c23844505861d7635d0fa0c8d", + "session_id": "as_583fd1f700ab42318bcc9e46783140e2", + "active_rag_session_id": "199e3b54-8cd7-4c9b-b745-21b9ef59fe19", "process_version": "v2", - "created_at": "2026-04-10T12:13:24.428329+00:00", + "created_at": "2026-04-10T13:17:17.674398+00:00", "message": "Какие методы апи есть в проекте?" } ``` @@ -42,7 +42,7 @@ "routing_mode": "llm_default", "llm_router_used": true, "reason_short": "Запрос явно касается списка доступных API-методов.", - "rag_session_id": "79ac0f0b-72a3-4b0a-8251-7cbccb7c5840" + "rag_session_id": "199e3b54-8cd7-4c9b-b745-21b9ef59fe19" } ``` @@ -321,19 +321,19 @@ { "status": "done", "answer": "GET /api/v1/clients/contacts-dgr\nGET /api/v1/clients/contacts-dgr/{contactid}", - "completed_at": "2026-04-10T12:13:28.508118+00:00" + "completed_at": "2026-04-10T13:17:19.560496+00:00" } ``` ## request ```json { - "request_id": "req_346208a33edf4c02831c33b5baada3f0", - "session_id": "as_340d7bd4e4ef4c59b5c381c51779fd34", - "active_rag_session_id": "79ac0f0b-72a3-4b0a-8251-7cbccb7c5840", + "request_id": "req_6222663333ee44a5a2aec41830c97f0a", + "session_id": "as_583fd1f700ab42318bcc9e46783140e2", + "active_rag_session_id": "199e3b54-8cd7-4c9b-b745-21b9ef59fe19", "process_version": "v2", - "created_at": "2026-04-10T12:13:43.879180+00:00", - "message": "Собери документацию по аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" + "created_at": "2026-04-10T13:17:54.957315+00:00", + "message": "Создай документацию по аналитике \n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md" } ``` @@ -344,7 +344,7 @@ "routing_domain": "DOCS", "intent": "DOC_UPDATE", "subintent": "FROM_FEATURE", - "normalized_query": "Собери документацию по аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", + "normalized_query": "Создай документацию по аналитике /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/create_contact.md", "target_terms": [ "/users/alex/dev_projects_v2/ai" ], @@ -386,8 +386,8 @@ "confidence": 0.8500000000000001, "routing_mode": "llm_default", "llm_router_used": true, - "reason_short": "Запрос содержит указание на конкретный файл с аналитикой и требует сбора документации.", - "rag_session_id": "79ac0f0b-72a3-4b0a-8251-7cbccb7c5840" + "reason_short": "Запрос явно указывает на создание документации по указанному файлу feature markdown.", + "rag_session_id": "199e3b54-8cd7-4c9b-b745-21b9ef59fe19" } ``` @@ -917,7 +917,7 @@ ```json { "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"proposed_content\": \"---\\\\nid: ui.contacts_dgr.create\\\\ndoc_type: ui_page\\\\ndomain: contacts_dgr\\\\nsub_domain: create_contact\\\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\\\nrelated_docs: []\\\\nstatus: draft\\\\n---\\\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\\\n## Summary\\\\n- Основная цель: реализация функционала создания карточки контакта ДГР.\\\\n- Актор: пользователь.\\\\n- Триггер: заполнение атрибутов карточки и нажатие кнопки «Добавить».\\\\n- Результат: отображение результата создания контакта ДГР в виде push-уведомления.\\\\n## Details\\\\n### Назначение страницы\\\\nСтраница предназначена для создания новой карточки контакта ДГР пользователем.\\\\n### Пользовательский сценарий\\\\n- Пользователь заполняет необходимые атрибуты карточки контакта.\\\\n- Нажимая кнопку «Добавить», инициируется вызов endpoint-а POST /api/v1/clients/contacts-dgr.\\\\n- После обработки запроса ufs.contacts_dgr страница отображает результат операции пользователю.\\\\n### Основные блоки интерфейса\\\\n- Форма ввода атрибутов контакта.\\\\n- Кнопка «Добавить».\\\\n- Блок уведомлений о результате операции.\\\\n### Связанные API и сущности\\\\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr.\\\\n- Обрабатывающая сущность: ufs.contacts_dgr.\\\\n### Функциональные требования\\\\nFR-1: При успешном создании контакта отображается push-уведомление.\\\\n### Нефункциональные требования\\\\nNFR-1: Время отклика endpoint-а POST /api/v1/clients/contacts-dgr не превышает 3 секунд.\\\\n### Ограничения и граничные случаи\\\\nНе указаны.\\\\n### Ошибки и валидации\\\\nВ случае ошибки создается уведомление об ошибке.\\\\n### Связанный код\\\\nКод реализации формы и логики отправки данных.\\\\n### Связанные документы\\\\nНе указаны.\\\\n### История изменений\\\\nНе указана.\"\n}" + "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"proposed_content\": \"---\\\\nid: ui.contacts_dgr.create\\\\ndoc_type: ui_page\\\\ntitle: Создание карточки контакта ДГР\\\\ndomain: contacts_dgr\\\\nsub_domain: create_contact\\\\nrelated_docs: []\\\\nstatus: draft\\\\n---\\\\n# Создание карточки контакта ДГР\\\\n## Summary\\\\n- Пользователь вводит данные контакта ДГР и отправляет форму.\\\\n- Система создает карточку через API.\\\\n- Отображается уведомление о результате.\\\\n## Details\\\\n### Назначение страницы\\\\nСтраница предназначена для ввода и сохранения новых контактов ДГР.\\\\n### Пользовательский сценарий\\\\nПользователь заполняет форму, система отправляет данные на сервер и отображает уведомление об успешности операции.\\\\n### Основные блоки интерфейса\\\\nФорма ввода данных, кнопка отправки, уведомления.\\\\n### Связанные API и сущности\\\\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr\\\\n### Функциональные требования\\\\nFR-1: Отправка заполненной формы контактных данных через API.\\\\n### Нефункциональные требования\\\\nNFR-1: Высокая доступность и надежность взаимодействия с backend.\\\\n### Ограничения и граничные случаи\\\\nПроверка корректности введенных данных перед отправкой.\\\\n### Ошибки и валидации\\\\nОбработка ошибок API и отображение пользователю.\\\\n### Связанный код\\\\nUI-компоненты формы и обработчики событий.\\\\n### Связанные документы\\\\nОтсутствуют.\\\\n### История изменений\\\\nНет.\"\n}" } ``` @@ -947,7 +947,7 @@ ```json { "event": "response", - "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr_api_create.md\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта методом POST /api/v1/clients/contacts-dgr\",\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ntype: api_method\\ndoc_type: api_method\\nname: contacts_dgr_api_create\\ntitle: Создать контакт методом POST /api/v1/clients/contacts-dgr\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nendpoint: POST /api/v1/clients/contacts-dgr\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-04\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [clients, contact_dgr]\\nentities: []\\nlinks: {}\\n---\\n\\n# Создать контакт методом POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\nМетод предназначен для создания нового контакта клиента в системе Contacts DGR.\\n\\n**Purpose**: создание контакта клиента.\\n**Actor**: клиентская система.\\n**Trigger**: вызов POST /api/v1/clients/contacts-dgr.\\n**Errors**: см. раздел Ошибки.\\n**Related**: UI контакты DGR.\\n\\n## Details\\n\\n### Описание\\n\\nМетод создает новый контакт клиента в системе Contacts DGR. Он проверяет входящие данные, авторизирует запрос и передает информацию в систему прpb.contacts_dgr для дальнейшей обработки.\\n\\n### Сценарий\\n\\n**Название:** создание контакта клиента\\n\\n**Предусловия:**\\n- Наличие валидного токена аутентификации.\\n- Наличие необходимых прав доступа.\\n\\n**Триггер:**\\n- Вызов метода POST /api/v1/clients/contacts-dgr.\\n\\n**Основной сценарий:**\\n1. Проверяется входящий запрос на соответствие JSON-схеме.\\n2. Авторизация запроса по наличию пермишена CI02792632.ContactsDGR.Create.\\n3. Вызов endpoint POST /contacts в системе прpb.contacts_dgr.\\n4. Возврат результата операции в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\n- Отсутствие необходимого пермишена приводит к завершению сценария с ошибкой UNAUTHORIZED.\\n\\n**Обработка ошибок:**\\n- В случае неверного формата запроса возвращается ошибка BAD_REQUEST.\\n\\n**Постусловие:**\\n- Новый контакт создан и доступен в системе.\\n\\n### Функциональные требования\\n\\n**FR-1.** Проверка входящих данных на соответствие JSON-схеме.\\n**FR-2.** Авторизация запроса по пермишену CI02792632.ContactsDGR.Create.\\n**FR-3.** Передача данных контакта в систему прpb.contacts_dgr.\\n**FR-4.** Формирование и возврат ответа в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n### Нефункциональные требования\\n\\n**NFR-1.** Метод должен обеспечивать высокую доступность и производительность.\\n**NFR-2.** Метод должен соответствовать требованиям безопасности и защиты персональных данных.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n| Атрибут | Где передается | Тип | Обязательность | Ограничения | Описание |\\n|---------|----------------|----------------|---------------|------------------|-----------------------------------------|\\n| X-Request-Id | header | uuid | да | | сквозной идентификатор вызова |\\n| X-Client-Ident-Id | header | string(50) | да | | идентификатор системы потребителя |\\n| X-Employee-Number | header | string(8) | нет | | табельный номер пользователя |\\n| contact | body | object | да | | данные контакта |\\n| client | body | object | да | | данные клиента |\\n| ... | | | | | дополнительные атрибуты контакта |\\n\\n#### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание |\\n|-------------|-----------------|---------------|--------------|----------------------------------|\\n| contactId | string(36) | да | | идентификатор созданного контакта |\\n\\n### Интеграции\\n\\nИнтеграция с системой прpb.contacts_dgr через endpoint POST /contacts.\\n\\n### Ошибки\\n\\n- **BAD_REQUEST**: некорректный формат запроса.\\n- **UNAUTHORIZED**: отсутствие необходимого пермишена.\\n\\n### Связанный код\\n\\nСвязан с реализацией UFS модуля контактов DGR.\\n\\n### История изменений\\n\\nНет.\"\n}" + "text": "{\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr_api_create.md\",\n \"reason\": \"Создание нового API-метода для сервиса CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ntype: api_method\\ndoc_type: api_method\\nname: create_contact\\ntitle: Создать контакт ДГР\\nmodule: contacts_dgr\\nlayer: application\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nendpoint: POST /api/v1/clients/contacts-dgr\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-04\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [UFSP]\\nentities: []\\nlinks: {}\\n---\\n\\n# Создать контакт ДГР\\n\\n## Summary\\n\\nМетод предназначен для создания контакта ДГР в системе клиентов.\\n\\n**Purpose**: Создание контакта ДГР.\\n**Actor**: Клиентская система.\\n**Trigger**: Запрос POST /api/v1/clients/contacts-dgr.\\n**Errors**: BAD_REQUEST, UNAUTHORIZED.\\n**Related Docs**: отсутствует.\\n\\n## Details\\n\\n## Описание\\n\\nHTTP-метод для создания контакта ДГР в системе клиентов.\\n\\n## Сценарий\\n\\n**Название:** Создание контакта ДГР\\n\\n**Предусловия:**\\n- Наличие валидного токена аутентификации.\\n- Наличие необходимых прав доступа.\\n\\n**Триггер:**\\n- Отправка HTTP-запроса POST /api/v1/clients/contacts-dgr.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность входящего запроса по JSON-схеме.\\n2. Выполняется проверка наличия пермишена CI02792632.ContactsDGR.Create.\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n4. Формируется и возвращается ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\n- При ошибке проверки схемы или отсутствия пермишена выполняется возврат соответствующего кода ошибки.\\n\\n**Обработка ошибок:**\\n- BAD_REQUEST при несоответствии JSON-схемы.\\n- UNAUTHORIZED при отсутствии необходимого пермишена.\\n\\n**Постусловие:**\\n- Создан новый контакт ДГР в системе.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\n**FR-2.** Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n**FR-4.** Вернуть ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Нефункциональные требования\\n\\nОтсутствуют.\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Атрибут | Обязательность | Тип | Где передается | Описание |\\n|---------------------------|---------------|---------------|------------------|----------------------------------------------|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя |\\n| contact | 1 | object | body | Данные контакта ДГР |\\n| contact.lastName | 0..1 | string(100) | part of body | Фамилия контакта |\\n| contact.firstName | 0..1 | string(100) | part of body | Имя контакта |\\n| contact.middleName | 0..1 | string(100) | part of body | Отчество контакта |\\n| contact.name | 0..1 | string(100) | part of body | Название группового контакта |\\n| contact.description | 0..1 | string(1000) | part of body | Описание группового контакта |\\n| contact.position | 0..1 | string(100) | part of body | Должность контакта у клиента |\\n| contact.comment | 0..1 | string(1000) | part of body | Комментарий к контакту |\\n| contact.contactType | 1 | enum(string) | part of body | Индивидуальный или групповой контакт |\\n| contact.crossboarding | 1 | boolean | part of body | Признак принадлежности к процессу онбординга |\\n| contact.createdBy | 1 | string(8) | part of body | Табельный номер создателя контакта |\\n| contact.emails | 0..1 | array(object) | part of body | Массив электронных адресов контакта |\\n| contact.emails.value | 1 | string(100) | part of emails | Электронный адрес |\\n| contact.emails.main | 1 | boolean | part of emails | Признак основной почты |\\n| contact.phones | 0..1 | array(object) | part of body | Массив телефонных номеров контакта |\\n| contact.phones.value | 1 | string(20) | part of phones | Телефонный номер контакта |\\n| contact.phones.extValue | 0..1 | string(10) | part of phones | Добавочный номер |\\n| contact.phones.main | 1 | boolean | part of phones | Признак основного телефона |\\n| contact.phones.mobile | 1 | boolean | part of phones | Признак мобильного телефона |\\n| client | 1 | object | body | Данные клиента |\\n| client.ucpId | 0..1 | string(36) | part of client | Идентификатор клиента ПАО |\\n| client.sbpId | 0..1 | string(36) | part of client | Идентификатор клиента АО |\\n| client.inn | 0..1 | string(12) | part of client | ИНН клиента |\\n| client.kpp | 0..1 | string(9) | part of client | КПП клиента |\\n\\n### Выходные параметры\\n\\n| Атрибут | Тип | Обязательность | Описание |\\n|--------------|--------------|---------------|-----------------------|\\n| contactId | string(36) | 1 | Идентификатор контакта |\\n\\n## Интеграции\\n\\nИнтеграция с сервисом prpb.contacts_dgr для создания контакта.\\n\\n## Ошибки\\n\\n| Код ошибки | HTTP-код | Причина |\\n|--------------|----------|-------------------------------------|\\n| BAD_REQUEST | 400 | Несоответствие входящего запроса схеме|\\n| UNAUTHORIZED | 401 | Отсутствие необходимого пермишена |\\n\\n## Связанный код\\n\\nОтсутствует.\\n\\n## История изменений\\n\\nОтсутствует.\"\n}" } ``` @@ -1142,7 +1142,7 @@ "issues_preview": [] }, "output": { - "answer_length": 6694, + "answer_length": 8728, "issues": 0, "changeset_items": 2, "_context": { @@ -1199,7 +1199,7 @@ } ], "apply_changeset": true, - "answer_len": 6694, + "answer_len": 8728, "issues_count": 0, "issues_preview": [] } @@ -1765,7 +1765,7 @@ "issues_preview": [] }, "output": { - "answer_length": 6694, + "answer_length": 8728, "issues": 0, "changeset_items": 2, "_context": { @@ -1822,7 +1822,7 @@ } ], "apply_changeset": true, - "answer_len": 6694, + "answer_len": 8728, "issues_count": 0, "issues_preview": [] } @@ -1845,7 +1845,7 @@ { "event": "answer_generated", "answer_mode": "docs_update_changeset", - "answer_length": 6694, + "answer_length": 8728, "changeset_items": 2, "apply_changeset": true } @@ -1855,7 +1855,7 @@ ```json { "status": "done", - "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nПлан изменений:\n- create: docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md (ui_page)\n- create: docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\\\nid: ui.contacts_dgr.create\\\\ndoc_type: ui_page\\\\ndomain: contacts_dgr\\\\nsub_domain: create_contact\\\\ntitle: FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\\\nrelated_docs: []\\\\nstatus: draft\\\\n---\\\\n# FR1. Реализовать сценарий «Контакты ДГР. Создание карточки контакта ДГР»\\\\n## Summary\\\\n- Основная цель: реализация функционала создания карточки контакта ДГР.\\\\n- Актор: пользователь.\\\\n- Триггер: заполнение атрибутов карточки и нажатие кнопки «Добавить».\\\\n- Результат: отображение результата создания контакта ДГР в виде push-уведомления.\\\\n## Details\\\\n### Назначение страницы\\\\nСтраница предназначена для создания новой карточки контакта ДГР пользователем.\\\\n### Пользовательский сценарий\\\\n- Пользователь заполняет необходимые атрибуты карточки контакта.\\\\n- Нажимая кнопку «Добавить», инициируется вызов endpoint-а POST /api/v1/clients/contacts-dgr.\\\\n- После обработки запроса ufs.contacts_dgr страница отображает результат операции пользователю.\\\\n### Основные блоки интерфейса\\\\n- Форма ввода атрибутов контакта.\\\\n- Кнопка «Добавить».\\\\n- Блок уведомлений о результате операции.\\\\n### Связанные API и сущности\\\\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr.\\\\n- Обрабатывающая сущность: ufs.contacts_dgr.\\\\n### Функциональные требования\\\\nFR-1: При успешном создании контакта отображается push-уведомление.\\\\n### Нефункциональные требования\\\\nNFR-1: Время отклика endpoint-а POST /api/v1/clients/contacts-dgr не превышает 3 секунд.\\\\n### Ограничения и граничные случаи\\\\nНе указаны.\\\\n### Ошибки и валидации\\\\nВ случае ошибки создается уведомление об ошибке.\\\\n### Связанный код\\\\nКод реализации формы и логики отправки данных.\\\\n### Связанные документы\\\\nНе указаны.\\\\n### История изменений\\\\nНе указана.\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ntype: api_method\\ndoc_type: api_method\\nname: contacts_dgr_api_create\\ntitle: Создать контакт методом POST /api/v1/clients/contacts-dgr\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nendpoint: POST /api/v1/clients/contacts-dgr\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-04\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [clients, contact_dgr]\\nentities: []\\nlinks: {}\\n---\\n\\n# Создать контакт методом POST /api/v1/clients/contacts-dgr\\n\\n## Summary\\n\\nМетод предназначен для создания нового контакта клиента в системе Contacts DGR.\\n\\n**Purpose**: создание контакта клиента.\\n**Actor**: клиентская система.\\n**Trigger**: вызов POST /api/v1/clients/contacts-dgr.\\n**Errors**: см. раздел Ошибки.\\n**Related**: UI контакты DGR.\\n\\n## Details\\n\\n### Описание\\n\\nМетод создает новый контакт клиента в системе Contacts DGR. Он проверяет входящие данные, авторизирует запрос и передает информацию в систему прpb.contacts_dgr для дальнейшей обработки.\\n\\n### Сценарий\\n\\n**Название:** создание контакта клиента\\n\\n**Предусловия:**\\n- Наличие валидного токена аутентификации.\\n- Наличие необходимых прав доступа.\\n\\n**Триггер:**\\n- Вызов метода POST /api/v1/clients/contacts-dgr.\\n\\n**Основной сценарий:**\\n1. Проверяется входящий запрос на соответствие JSON-схеме.\\n2. Авторизация запроса по наличию пермишена CI02792632.ContactsDGR.Create.\\n3. Вызов endpoint POST /contacts в системе прpb.contacts_dgr.\\n4. Возврат результата операции в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\n- Отсутствие необходимого пермишена приводит к завершению сценария с ошибкой UNAUTHORIZED.\\n\\n**Обработка ошибок:**\\n- В случае неверного формата запроса возвращается ошибка BAD_REQUEST.\\n\\n**Постусловие:**\\n- Новый контакт создан и доступен в системе.\\n\\n### Функциональные требования\\n\\n**FR-1.** Проверка входящих данных на соответствие JSON-схеме.\\n**FR-2.** Авторизация запроса по пермишену CI02792632.ContactsDGR.Create.\\n**FR-3.** Передача данных контакта в систему прpb.contacts_dgr.\\n**FR-4.** Формирование и возврат ответа в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n### Нефункциональные требования\\n\\n**NFR-1.** Метод должен обеспечивать высокую доступность и производительность.\\n**NFR-2.** Метод должен соответствовать требованиям безопасности и защиты персональных данных.\\n\\n### Контракт\\n\\n#### Входные параметры\\n\\n| Атрибут | Где передается | Тип | Обязательность | Ограничения | Описание |\\n|---------|----------------|----------------|---------------|------------------|-----------------------------------------|\\n| X-Request-Id | header | uuid | да | | сквозной идентификатор вызова |\\n| X-Client-Ident-Id | header | string(50) | да | | идентификатор системы потребителя |\\n| X-Employee-Number | header | string(8) | нет | | табельный номер пользователя |\\n| contact | body | object | да | | данные контакта |\\n| client | body | object | да | | данные клиента |\\n| ... | | | | | дополнительные атрибуты контакта |\\n\\n#### Выходные параметры\\n\\n| Поле | Тип | Обязательность | Ограничения | Описание |\\n|-------------|-----------------|---------------|--------------|----------------------------------|\\n| contactId | string(36) | да | | идентификатор созданного контакта |\\n\\n### Интеграции\\n\\nИнтеграция с системой прpb.contacts_dgr через endpoint POST /contacts.\\n\\n### Ошибки\\n\\n- **BAD_REQUEST**: некорректный формат запроса.\\n- **UNAUTHORIZED**: отсутствие необходимого пермишена.\\n\\n### Связанный код\\n\\nСвязан с реализацией UFS модуля контактов DGR.\\n\\n### История изменений\\n\\nНет.\",\n \"reason\": \"Реализация сервиса CLIENTS. Создание контакта методом POST /api/v1/clients/contacts-dgr\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", - "completed_at": "2026-04-10T12:14:20.937787+00:00" + "answer": "DOC_UPDATE/FROM_FEATURE: результат построения changeset.\n\nПлан изменений:\n- create: docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md (ui_page)\n- create: docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md (api_method)\n\nChangeset (для плагина):\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/web/ui/ui.contacts_dgr.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\\\nid: ui.contacts_dgr.create\\\\ndoc_type: ui_page\\\\ntitle: Создание карточки контакта ДГР\\\\ndomain: contacts_dgr\\\\nsub_domain: create_contact\\\\nrelated_docs: []\\\\nstatus: draft\\\\n---\\\\n# Создание карточки контакта ДГР\\\\n## Summary\\\\n- Пользователь вводит данные контакта ДГР и отправляет форму.\\\\n- Система создает карточку через API.\\\\n- Отображается уведомление о результате.\\\\n## Details\\\\n### Назначение страницы\\\\nСтраница предназначена для ввода и сохранения новых контактов ДГР.\\\\n### Пользовательский сценарий\\\\nПользователь заполняет форму, система отправляет данные на сервер и отображает уведомление об успешности операции.\\\\n### Основные блоки интерфейса\\\\nФорма ввода данных, кнопка отправки, уведомления.\\\\n### Связанные API и сущности\\\\n- Вызываемый endpoint: POST /api/v1/clients/contacts-dgr\\\\n### Функциональные требования\\\\nFR-1: Отправка заполненной формы контактных данных через API.\\\\n### Нефункциональные требования\\\\nNFR-1: Высокая доступность и надежность взаимодействия с backend.\\\\n### Ограничения и граничные случаи\\\\nПроверка корректности введенных данных перед отправкой.\\\\n### Ошибки и валидации\\\\nОбработка ошибок API и отображение пользователю.\\\\n### Связанный код\\\\nUI-компоненты формы и обработчики событий.\\\\n### Связанные документы\\\\nОтсутствуют.\\\\n### История изменений\\\\nНет.\",\n \"reason\": \"Реализация сценария создания карточки контакта ДГР\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/contacts_dgr/ufs/api/ufs.contacts_dgr.api.create.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: ufs.contacts_dgr.api.create\\ntype: api_method\\ndoc_type: api_method\\nname: create_contact\\ntitle: Создать контакт ДГР\\nmodule: contacts_dgr\\nlayer: application\\ndomain: contacts_dgr\\nsub_domain: create_contact\\nendpoint: POST /api/v1/clients/contacts-dgr\\nrelated_docs: []\\nstatus: draft\\nupdated_at: 2023-10-04\\nsource_of_truth: system_analytics\\nparent: null\\nchildren: []\\ntags: [UFSP]\\nentities: []\\nlinks: {}\\n---\\n\\n# Создать контакт ДГР\\n\\n## Summary\\n\\nМетод предназначен для создания контакта ДГР в системе клиентов.\\n\\n**Purpose**: Создание контакта ДГР.\\n**Actor**: Клиентская система.\\n**Trigger**: Запрос POST /api/v1/clients/contacts-dgr.\\n**Errors**: BAD_REQUEST, UNAUTHORIZED.\\n**Related Docs**: отсутствует.\\n\\n## Details\\n\\n## Описание\\n\\nHTTP-метод для создания контакта ДГР в системе клиентов.\\n\\n## Сценарий\\n\\n**Название:** Создание контакта ДГР\\n\\n**Предусловия:**\\n- Наличие валидного токена аутентификации.\\n- Наличие необходимых прав доступа.\\n\\n**Триггер:**\\n- Отправка HTTP-запроса POST /api/v1/clients/contacts-dgr.\\n\\n**Основной сценарий:**\\n1. Проверяется валидность входящего запроса по JSON-схеме.\\n2. Выполняется проверка наличия пермишена CI02792632.ContactsDGR.Create.\\n3. Вызывается endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n4. Формируется и возвращается ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n**Альтернативный сценарий:**\\n- При ошибке проверки схемы или отсутствия пермишена выполняется возврат соответствующего кода ошибки.\\n\\n**Обработка ошибок:**\\n- BAD_REQUEST при несоответствии JSON-схемы.\\n- UNAUTHORIZED при отсутствии необходимого пермишена.\\n\\n**Постусловие:**\\n- Создан новый контакт ДГР в системе.\\n\\n## Функциональные требования\\n\\n**FR-1.** Проверить входящий запрос на соответствие JSON-схеме.\\n**FR-2.** Авторизовать запрос по наличию пермишена CI02792632.ContactsDGR.Create.\\n**FR-3.** Вызвать endpoint POST /contacts в prpb.contacts_dgr для создания контакта.\\n**FR-4.** Вернуть ответ в формате UfsBaseResponseContactDGRCreateRsDto.\\n\\n## Нефункциональные требования\\n\\nОтсутствуют.\\n\\n## Контракт\\n\\n### Входные параметры\\n\\n| Атрибут | Обязательность | Тип | Где передается | Описание |\\n|---------------------------|---------------|---------------|------------------|----------------------------------------------|\\n| X-Request-Id | 1 | uuid | header | Сквозной идентификатор вызова |\\n| X-Client-Ident-Id | 1 | string(50) | header | Идентификатор системы потребителя |\\n| X-Employee-Number | 0..1 | string(8) | header | Табельный номер пользователя |\\n| contact | 1 | object | body | Данные контакта ДГР |\\n| contact.lastName | 0..1 | string(100) | part of body | Фамилия контакта |\\n| contact.firstName | 0..1 | string(100) | part of body | Имя контакта |\\n| contact.middleName | 0..1 | string(100) | part of body | Отчество контакта |\\n| contact.name | 0..1 | string(100) | part of body | Название группового контакта |\\n| contact.description | 0..1 | string(1000) | part of body | Описание группового контакта |\\n| contact.position | 0..1 | string(100) | part of body | Должность контакта у клиента |\\n| contact.comment | 0..1 | string(1000) | part of body | Комментарий к контакту |\\n| contact.contactType | 1 | enum(string) | part of body | Индивидуальный или групповой контакт |\\n| contact.crossboarding | 1 | boolean | part of body | Признак принадлежности к процессу онбординга |\\n| contact.createdBy | 1 | string(8) | part of body | Табельный номер создателя контакта |\\n| contact.emails | 0..1 | array(object) | part of body | Массив электронных адресов контакта |\\n| contact.emails.value | 1 | string(100) | part of emails | Электронный адрес |\\n| contact.emails.main | 1 | boolean | part of emails | Признак основной почты |\\n| contact.phones | 0..1 | array(object) | part of body | Массив телефонных номеров контакта |\\n| contact.phones.value | 1 | string(20) | part of phones | Телефонный номер контакта |\\n| contact.phones.extValue | 0..1 | string(10) | part of phones | Добавочный номер |\\n| contact.phones.main | 1 | boolean | part of phones | Признак основного телефона |\\n| contact.phones.mobile | 1 | boolean | part of phones | Признак мобильного телефона |\\n| client | 1 | object | body | Данные клиента |\\n| client.ucpId | 0..1 | string(36) | part of client | Идентификатор клиента ПАО |\\n| client.sbpId | 0..1 | string(36) | part of client | Идентификатор клиента АО |\\n| client.inn | 0..1 | string(12) | part of client | ИНН клиента |\\n| client.kpp | 0..1 | string(9) | part of client | КПП клиента |\\n\\n### Выходные параметры\\n\\n| Атрибут | Тип | Обязательность | Описание |\\n|--------------|--------------|---------------|-----------------------|\\n| contactId | string(36) | 1 | Идентификатор контакта |\\n\\n## Интеграции\\n\\nИнтеграция с сервисом prpb.contacts_dgr для создания контакта.\\n\\n## Ошибки\\n\\n| Код ошибки | HTTP-код | Причина |\\n|--------------|----------|-------------------------------------|\\n| BAD_REQUEST | 400 | Несоответствие входящего запроса схеме|\\n| UNAUTHORIZED | 401 | Отсутствие необходимого пермишена |\\n\\n## Связанный код\\n\\nОтсутствует.\\n\\n## История изменений\\n\\nОтсутствует.\",\n \"reason\": \"Создание нового API-метода для сервиса CLIENTS. POST /api/v1/clients/contacts-dgr\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", + "completed_at": "2026-04-10T13:18:40.416295+00:00" } ``` diff --git a/runtime_traces/agent_requests/20260413-185533-2ffc120d1d63.md b/runtime_traces/agent_requests/20260413-185533-2ffc120d1d63.md new file mode 100644 index 0000000..52dfd80 --- /dev/null +++ b/runtime_traces/agent_requests/20260413-185533-2ffc120d1d63.md @@ -0,0 +1,164 @@ +# Runtime Trace: 20260413-185533-2ffc120d1d63 + +- active_rag_session_id: cac16675-546d-46af-a792-2ffc120d1d63 + +## request +```json +{ + "request_id": "req_0bf6382e1ac04a5ead2847c02802f580", + "session_id": "as_9d6518890b834bba9eb687b6acc5d212", + "active_rag_session_id": "cac16675-546d-46af-a792-2ffc120d1d63", + "process_version": "v2", + "created_at": "2026-04-13T18:55:33.279163+00:00", + "message": "Собери документацию из аналитики\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md" +} +``` + +## process.v2 +```json +{ + "event": "intent_routed", + "routing_domain": "DOCS", + "intent": "DOC_UPDATE", + "subintent": "FROM_FEATURE", + "normalized_query": "Собери документацию из аналитики /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "target_terms": [ + "/users/alex/dev_projects_v2/ai" + ], + "anchors": { + "entity_names": [ + "Users", + "Dev_projects_v2" + ], + "file_names": [ + "process/v2/test_doc/features/order_list.md" + ], + "endpoint_paths": [ + "/users/alex/dev_projects_v2/ai" + ], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null, + "scope_type": "entity", + "candidate_domains": [], + "candidate_subdomains": [], + "candidate_entities": [ + "list" + ], + "candidate_apis": [], + "signal_types": [ + "API_ENDPOINT", + "DOMAIN_ENTITY", + "LOGIC_FLOW" + ] + }, + "confidence": 0.9, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "Запрос содержит указание на конкретный md-файл с аналитикой и требует собрать документацию.", + "rag_session_id": "cac16675-546d-46af-a792-2ffc120d1d63" +} +``` + +## process.v2.pipeline +```json +{ + "event": "router_resolved", + "domain": "DOCS", + "intent": "DOC_UPDATE", + "subintent": "FROM_FEATURE", + "confidence": 0.9 +} +``` + +## process.v2.pipeline +```json +{ + "event": "anchors_extracted", + "signal_types": [ + "API_ENDPOINT", + "DOMAIN_ENTITY", + "LOGIC_FLOW" + ], + "endpoint_paths": [ + "/users/alex/dev_projects_v2/ai" + ], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "target_terms": [ + "/users/alex/dev_projects_v2/ai" + ] +} +``` + +## process.v2.pipeline +```json +{ + "event": "alias_resolution", + "resolved_aliases": [], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ] +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_started", + "workflow_id": "v2.docs_update.from_feature_v2" +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_completed", + "workflow_id": "v2.docs_update.from_feature_v2" +} +``` + +## process.v2.pipeline +```json +{ + "event": "answer_generated", + "answer_mode": "docs_update_changeset_v2", + "changeset_items": 3, + "apply_changeset": true +} +``` + +## result +```json +{ + "status": "done", + "answer": "DOC_UPDATE/FROM_FEATURE v2: сформирован changeset.\n\nIssues:\n- Не найден metadata-тег analysis_id в начале аналитики.\n- Пропущен DELETE для docs/orders_web/web/ui_page/orders.ui.list.md: не найден текущий файл.\n\nTasks:\n- 6.3 create: docs/orders_pprb/pprb/api_method/orders.api.pprb.list.md [pprb | api_method]\n- 6.2 create: docs/orders_ufs/ufs/api_method/orders.api.ufs.list.md [ufs | api_method]\n- 6.4 create: docs/orders_ufs/ufs/logic_block/orders.logic.list.mapping.md [ufs | logic_block]\n- 6.1 delete: docs/orders_web/web/ui_page/orders.ui.list.md [web | ui_page]\n\nChangeset:\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/orders_pprb/pprb/api_method/orders.api.pprb.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.api.pprb.list\\ntitle: Метод PPRB получения списка заказов\\ndoc_type: api_method\\nstatus: draft\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.ufs.list\\n - orders.logic.list.mapping\\n - orders.ui.list\\n---\\n\\n## Summary\\n\\n- Документ описывает метод PPRB для получения списка заказов через API.\\n- Используется HTTP-метод GET с обязательным указанием параметров пагинации и уникального идентификатора запроса.\\n- Метод возвращает список заказов с подробной информацией о каждом заказе и общее количество заказов в системе.\\n- Реализованы метрики мониторинга успешных запросов, технических и бизнес-ошибок.\\n\\n## Details\\n\\n### Технический use case\\n\\n**Предусловия:** \\n- Пользователь аутентифицирован и авторизован в системе.\\n- Передан валидный сквозной идентификатор запроса.\\n\\n**Триггер:** \\n- Поступает HTTP-запрос типа GET с параметрами пагинации на endpoint `/orders`.\\n\\n**Основной сценарий:**\\n\\n1. Система принимает запрос на получение списка заказов.\\n2. Выполняется проверка обязательных параметров (идентификатора запроса, номера страницы, размера страницы).\\n3. Формируется SQL-запрос с учетом пагинации и фильтрации.\\n4. Выполняется чтение данных из базы данных.\\n5. Происходит формирование JSON-ответа с данными о заказах и общим количеством записей.\\n6. Отправляется ответ клиенту.\\n\\n**Альтернативный сценарий (в случае технической ошибки):**\\n\\n1. При возникновении ошибки БД, таймаута или недоступности инфраструктуры фиксируются метрики мониторинга.\\n2. Формируется сообщение об ошибке.\\n3. Отправляется ответ с кодом состояния 5xx.\\n\\n**Постусловие:** \\n- Запись успешно обработана и возвращен корректный ответ либо зафиксирована ошибка и отправлено соответствующее сообщение.\\n\\n### Функциональные требования\\n\\nФункциональные требования для данного метода не выявлены.\\n\\n### Нефункциональные требования\\n\\n#### Мониторинг\\n\\nМониторинг осуществляется через следующие метрики:\\n\\n| Метрика | Описание | Условие срабатывания |\\n| --------------------------------- | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |\\n| `ORDERS_LIST_PPRB_SUCCESS` | Метрика успешной обработки запроса на стороне PPRB. | Фиксируется при успешном чтении данных из БД и возврате корректного ответа без ошибок. |\\n| `ORDERS_LIST_PPRB_FAIL` | Метрика технической ошибки на стороне PPRB. | Фиксируется при техническом сбое (ошибка БД, таймаут, недоступность инфраструктуры, необработанное исключение, ошибка 5xx). |\\n| `ORDERS_LIST_PPRB_BUSINESS_ERROR` | Метрика бизнес-ошибки доступа на стороне PPRB. | Фиксируется, если проверка ролевой модели завершилась отказом (нет требуемого экшена). |\\n\",\n \"reason\": \"Метод PPRB получения списка заказов\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders_ufs/ufs/api_method/orders.api.ufs.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.api.ufs.list\\ntitle: Метод UFS получения списка заказов\\ndoc_type: api_method\\nstatus: draft\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.pprb.list\\n - orders.logic.list.mapping\\n - orders.ui.list\\n---\\n\\n## Summary\\n\\n- Описывает метод UFS для получения списка заказов через API.\\n- Использует HTTP-метод GET с обязательными параметрами пагинации и уникальным идентификатором запроса.\\n- Включает проверку авторизации пользователя согласно ролевой модели.\\n- Осуществляет интеграцию с методом PPRB для получения исходных данных.\\n- Возвращает смаппенные данные в формате контракта UFS.\\n- Реализована система аудита запросов и мониторинг технических, бизнес-ошибок и успешных операций.\\n\\n## Details\\n\\n### Технический use case\\n\\n**Предусловия:** \\n- Пользователь аутентифицирован и авторизован в системе.\\n- Переданы валидные параметры запроса, включая уникальный идентификатор запроса, номер страницы и размер страницы.\\n\\n**Триггер:** \\n- Поступает HTTP-запрос типа GET на endpoint `/api/v1/orders`.\\n\\n**Основной сценарий:**\\n\\n1. Система принимает запрос и проверяет наличие и корректность обязательных header- и query-параметров.\\n2. Выполняется проверка прав пользователя на выполнение действия `Role.Orders.List`.\\n3. В случае успешного прохождения проверки выполняется HTTP-запрос методом GET на сервис PPRB с endpoint `/orders`.\\n4. Полученные данные обрабатываются и преобразуются в формат контракта UFS.\\n5. Формируется JSON-ответ с перечнем заказов, включающий информацию о наименовании заказа, клиенте, сумме и статусе, а также сведения о текущей странице, размере страницы и общем количестве заказов.\\n6. Ответ отправляется клиенту.\\n\\n**Альтернативный сценарий (при отсутствии необходимых прав доступа):**\\n\\n1. В случае отсутствия у пользователя необходимого экшена ролевой модели генерируется событие аудита с типом `ORDERS_LIST_REQUESTED` и устанавливается статус ошибки.\\n2. Клиенту возвращается соответствующий статус ошибки и сообщение.\\n\\n**Альтернативный сценарий (в случае технической ошибки):**\\n\\n1. При возникновении ошибки со стороны PPRB, сетевого взаимодействия или других технических проблем система фиксирует соответствующую метрику мониторинга.\\n2. Формируется сообщение об ошибке.\\n3. Отправляется ответ с соответствующим статусом ошибки (например, 5xx).\\n\\n**Постусловие:** \\n- Запрос успешно обработан и отправлен корректный ответ пользователю, либо зафиксировано возникновение ошибки и отправлено соответствующее сообщение.\\n\",\n \"reason\": \"Метод UFS получения списка заказов\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders_ufs/ufs/logic_block/orders.logic.list.mapping.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.logic.list.mapping\\ntitle: Маппинг модели PPRB в модель UFS\\ndoc_type: logic_block\\nstatus: draft\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.pprb.list\\n - orders.api.ufs.list\\n - orders.ui.list\\n---\\n\\n## Summary\\n\\n- Описывает маппинг модели PPRB в модель UFS для нормализации структуры данных при получении списка заказов.\\n- Ключевые маппинги включают переназначение полей `orderName -> name`, `clientDisplayName -> clientName`, `orderAmount -> amount`, `orderStatus -> status`.\\n- Обеспечивает обработку пустых строковых значений, возвращая пустую строку `\\\" \\\"` и сохраняя исходный порядок элементов списка.\\n- Не требует учета аудита и включает мониторинг времени выполнения маппинга на уровне debug/trace.\\n\\n## Details\\n\\n### Детализированное описание маппинга\\n\\nРеализация маппинга включает:\\n\\n- Преобразование полей модели PPRB в соответствующие поля контракта UFS:\\n - Поле `orderName` модели PPRB преобразуется в поле `name`.\\n - Поле `clientDisplayName` модели PPRB преобразуется в поле `clientName`.\\n - Поле `orderAmount` модели PPRB преобразуется в поле `amount`.\\n - Поле `orderStatus` модели PPRB преобразуется в поле `status`.\\n \\n- Обработка пустых строковых значений: \\n - Все пустые строки должны возвращаться как пустая строка `\\\"\\\"`\\n\\n- Сохранение порядка элементов списка:\\n - Порядок элементов входящего списка PPRB сохраняется неизменным после преобразования в модель UFS.\\n\\nТаким образом, обеспечивается корректное и последовательное преобразование данных для дальнейшей передачи их в пользовательский интерфейс.\\n\",\n \"reason\": \"Маппинг модели PPRB в модель UFS\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", + "completed_at": "2026-04-13T18:56:15.938987+00:00" +} +``` diff --git a/runtime_traces/agent_requests/20260414-123147-7612de47e98e.md b/runtime_traces/agent_requests/20260414-123147-7612de47e98e.md new file mode 100644 index 0000000..719f744 --- /dev/null +++ b/runtime_traces/agent_requests/20260414-123147-7612de47e98e.md @@ -0,0 +1,164 @@ +# Runtime Trace: 20260414-123147-7612de47e98e + +- active_rag_session_id: 343f820f-d3c7-4789-97cd-7612de47e98e + +## request +```json +{ + "request_id": "req_8e0720e600f94f00a2fa7ab8c12b17a3", + "session_id": "as_92c0afd4286b4863aa65b8230a07f30b", + "active_rag_session_id": "343f820f-d3c7-4789-97cd-7612de47e98e", + "process_version": "v2", + "created_at": "2026-04-14T12:31:47.039206+00:00", + "message": "Собери документацию из аналитики\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md" +} +``` + +## process.v2 +```json +{ + "event": "intent_routed", + "routing_domain": "DOCS", + "intent": "DOC_UPDATE", + "subintent": "FROM_FEATURE", + "normalized_query": "Собери документацию из аналитики /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "target_terms": [ + "/users/alex/dev_projects_v2/ai" + ], + "anchors": { + "entity_names": [ + "Users", + "Dev_projects_v2" + ], + "file_names": [ + "process/v2/test_doc/features/order_list.md" + ], + "endpoint_paths": [ + "/users/alex/dev_projects_v2/ai" + ], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null, + "scope_type": "entity", + "candidate_domains": [], + "candidate_subdomains": [], + "candidate_entities": [ + "list" + ], + "candidate_apis": [], + "signal_types": [ + "API_ENDPOINT", + "DOMAIN_ENTITY", + "LOGIC_FLOW" + ] + }, + "confidence": 0.9, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "Запрос на сбор документации из файла аналитики, указан конкретный путь к файлу.", + "rag_session_id": "343f820f-d3c7-4789-97cd-7612de47e98e" +} +``` + +## process.v2.pipeline +```json +{ + "event": "router_resolved", + "domain": "DOCS", + "intent": "DOC_UPDATE", + "subintent": "FROM_FEATURE", + "confidence": 0.9 +} +``` + +## process.v2.pipeline +```json +{ + "event": "anchors_extracted", + "signal_types": [ + "API_ENDPOINT", + "DOMAIN_ENTITY", + "LOGIC_FLOW" + ], + "endpoint_paths": [ + "/users/alex/dev_projects_v2/ai" + ], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "target_terms": [ + "/users/alex/dev_projects_v2/ai" + ] +} +``` + +## process.v2.pipeline +```json +{ + "event": "alias_resolution", + "resolved_aliases": [], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ] +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_started", + "workflow_id": "v2.docs_update.from_feature_v2" +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_completed", + "workflow_id": "v2.docs_update.from_feature_v2" +} +``` + +## process.v2.pipeline +```json +{ + "event": "answer_generated", + "answer_mode": "docs_update_changeset_v2", + "changeset_items": 3, + "apply_changeset": true +} +``` + +## result +```json +{ + "status": "done", + "answer": "DOC_UPDATE/FROM_FEATURE v2: сформирован changeset.\n\nIssues:\n- Не найден metadata-тег analysis_id в начале аналитики.\n- Пропущен DELETE для docs/orders_web/web/ui_page/orders.ui.list.md: не найден текущий файл.\n\nTasks:\n- 6.3 create: docs/orders_pprb/pprb/api_method/orders.api.pprb.list.md [pprb | api_method]\n- 6.2 create: docs/orders_ufs/ufs/api_method/orders.api.ufs.list.md [ufs | api_method]\n- 6.4 create: docs/orders_ufs/ufs/logic_block/orders.logic.list.mapping.md [ufs | logic_block]\n- 6.1 delete: docs/orders_web/web/ui_page/orders.ui.list.md [web | ui_page]\n\nChangeset:\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/orders_pprb/pprb/api_method/orders.api.pprb.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.api.pprb.list\\ntitle: Метод PPRB получения списка заказов\\ndoc_type: api_method\\nstatus: created\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.ufs.list\\n - orders.logic.list.mapping\\n - orders.ui.list\\n---\\n\\n## Summary\\n\\n- Документ описывает метод PPRB для получения списка заказов.\\n- Метод обрабатывает GET-запросы к `/orders` от UFS с параметрами пагинации.\\n- Возвращает список заказов с информацией о сумме, статусе, клиенте и общем количестве заказов.\\n- Реализованы метрики мониторинга успешных запросов, технических и бизнес-ошибок.\\n\\n## Details\\n\\n## Details\\n\\n### Технический use case\\n\\n**Предусловия:** \\n- Пользователь прошел аутентификацию и авторизацию.\\n- Передан валидный X-Request-Id.\\n\\n**Триггер:** \\n- Поступает GET-запрос на endpoint `/orders`.\\n\\n**Основной сценарий:**\\n\\n1. **Проверка параметров запроса.** \\n Сервис проверяет наличие обязательных параметров `page`, `size` и `X-Request-Id`. \\n \\n2. **Получение списка заказов.** \\n Выполняется SQL-запрос к базе данных с использованием пагинации согласно переданным параметрам.\\n\\n3. **Формирование ответа.** \\n Формируется JSON-ответ, содержащий список заказов и общее количество записей.\\n\\n4. **Возврат результата клиенту.** \\n Результат отправляется в виде HTTP-ответа со статусом 200 OK.\\n\\n**Альтернативный сценарий (при наличии бизнес-ошибки):** \\n- При отсутствии у пользователя необходимых прав сервис возвращает ошибку с кодом 403 Forbidden.\\n\\n**Обработка ошибок:**\\n- В случае технических ошибок (например, проблемы с базой данных) возвращается статус 500 Internal Server Error.\\n\\n**Постусловие:** \\n- Запись успешных операций мониторинга фиксируется метрикой `ORDERS_LIST_PPRB_SUCCESS`.\\n- В случае технической ошибки регистрируется метрика `ORDERS_LIST_PPRB_FAIL`.\\n- При бизнес-ошибке доступа регистрируется метрика `ORDERS_LIST_PPRB_BUSINESS_ERROR`.\\n\\n### Функциональные требования\\n\\nФункциональные требования не выявлены.\\n\\n### Нефункциональные требования\\n\\n#### Мониторинг\\n\\nМониторинг осуществляется по следующим метрикам:\\n\\n| Метрика | Описание | Условие срабатывания |\\n| --------------------------------- | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |\\n| `ORDERS_LIST_PPRB_SUCCESS` | Метрика успешной обработки запроса на стороне PPRB. | Фиксируется при успешном чтении данных из БД и возврате корректного ответа без ошибок. |\\n| `ORDERS_LIST_PPRB_FAIL` | Метрика технической ошибки на стороне PPRB. | Фиксируется при техническом сбое (ошибка БД, таймаут, недоступность инфраструктуры, необработанное исключение, ошибка 5xx). |\\n| `ORDERS_LIST_PPRB_BUSINESS_ERROR` | Метрика бизнес-ошибки доступа на стороне PPRB. | Фиксируется, если проверка ролевой модели завершилась отказом (нет требуемого экшена). |\\n\",\n \"reason\": \"Метод PPRB получения списка заказов\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders_ufs/ufs/api_method/orders.api.ufs.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.api.ufs.list\\ntitle: Метод UFS получения списка заказов\\ndoc_type: api_method\\nstatus: created\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.pprb.list\\n - orders.logic.list.mapping\\n - orders.ui.list\\n---\\n\\n## Summary\\n\\n- Описывает метод UFS для получения списка заказов.\\n- Получает запросы `GET /api/v1/orders` с параметрами пагинации.\\n- Проводит валидацию query-параметров и авторизацию пользователя по ролям.\\n- Интегрируется с методом PPRB для получения данных.\\n- Отображает список заказов с информацией о сумме, статусе, названии клиента и общим количеством заказов.\\n- Реализована система аудита и мониторинга успешности запросов, технических и бизнес-ошибок.\\n\\n## Details\\n\\n## Details\\n\\n### Технический use case\\n\\n**Предусловия:** \\n- Пользователь успешно авторизован и прошел проверку ролевой модели.\\n- Передан валидный X-Request-Id.\\n\\n**Триггер:** \\n- Поступает GET-запрос на endpoint `/api/v1/orders`.\\n\\n**Основной сценарий:**\\n\\n1. **Провалидировать параметры запроса.** \\n Сервис проверяет наличие и корректность обязательных параметров `page`, `size` и `X-Request-Id`.\\n \\n2. **Авторизация пользователя.** \\n Проверяется наличие у пользователя необходимого экшена ролевой модели `Role.Orders.List`.\\n\\n3. **Получение списка заказов от PPRB.** \\n Выполняется вызов метода PPRB с передачей параметров пагинации. \\n\\n4. **Смаппинг ответа PPRB в контракт UFS.** \\n Ответ PPRB преобразуется в формат контракта UFS, включающий данные о заказах (сумма, статус, наименование клиента).\\n\\n5. **Возврат сформированного ответа UI.** \\n Отформатированный результат передается обратно пользователю.\\n\\n**Альтернативный сценарий (отсутствие нужных прав):** \\n- Если у пользователя отсутствует необходимый экшен ролевой модели, возвращается ошибка с кодом 403 Forbidden.\\n\\n**Обработка ошибок:** \\n- В случае возникновения технических проблем (таймауты, сетевые сбои, ошибки базы данных) возвращается статус 500 Internal Server Error.\\n\\n**Постусловие:** \\n- Записи об успешном выполнении запроса фиксируются метрикой `ORDERS_LIST_UFS_SUCCESS`.\\n- В случае технической ошибки регистрируется метрика `ORDERS_LIST_UFS_FAIL`.\\n- При бизнес-ошибке доступа регистрируется метрика `ORDERS_LIST_UFS_BUSINESS_ERROR`.\\n\\n### Функциональные требования\\n\\nФункциональные требования не выявлены.\\n\\n### Нефункциональные требования\\n\\n#### Аудит\\n\\nАудиторские записи фиксируются следующей метрикой:\\n\\n| Код события | Описание события | Логируемые атрибуты |\\n|------------------------|----------------------------------------------|--------------------------------------------------------|\\n| `ORDERS_LIST_REQUESTED` | Вызов метода получения списка заказов в UFS. | `requestId`, `userId`, `page`, `size`, `responseCode` |\\n\\n#### Мониторинг\\n\\nМониторинг осуществляется по следующим метрикам:\\n\\n| Метрика | Описание | Условие срабатывания |\\n|-----------------------------------|-----------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------|\\n| `ORDERS_LIST_UFS_SUCCESS` | Метрика успешной обработки обработки на получение списка заказов. | Фиксируется при успешном завершении сценария и возврате корректного ответа без ошибок. |\\n| `ORDERS_LIST_UFS_FAIL` | Метрика технической ошибки при обработке запроса. | Фиксируется при техническом сбое (ошибка сети, таймаут, необработанное исключение, недоступность зависимого сервиса, ошибка 5xx). |\\n| `ORDERS_LIST_UFS_BUSINESS_ERROR` | Метрика бизнес-ошибки доступа. | Фиксируется, если у пользователя отсутствует экшен ролевой модели `Role.Orders.List`. |\\n\",\n \"reason\": \"Метод UFS получения списка заказов\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders_ufs/ufs/logic_block/orders.logic.list.mapping.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.logic.list.mapping\\ntitle: Маппинг модели PPRB в модель UFS\\ndoc_type: logic_block\\nstatus: created\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.pprb.list\\n - orders.api.ufs.list\\n - orders.ui.list\\n---\\n\\n## Summary\\n\\n- Данный документ описывает маппинг модели PPRB в модель UFS для получения списка заказов.\\n- Осуществляется преобразование полей DTO ответа PPRB в контракт UFS с последующей нормализацией структуры для представления на UI.\\n- Ключевые преобразования включают маппинг полей `orderName -> name`, `clientDisplayName -> clientName`, `orderAmount -> amount`, `orderStatus -> status`.\\n- Обеспечивается обработка пустых строковых значений путем возврата пустой строки `\\\" \\\"` и сохранение порядка элементов списка без изменений.\\n\\n## Details\\n\\n## Details\\n\\n### Технический use case\\n\\n**Предусловия:** \\n- Получен ответ DTO от PPRB.\\n\\n**Триггер:** \\n- Необходимость преобразования полученного DTO в формат контракта UFS.\\n\\n**Основной сценарий:** \\n1. **Получение DTO от PPRB.** \\n Используется ответ, полученный от PPRB в формате DTO.\\n \\n2. **Выполнение маппинга полей.** \\n Выполняется маппинг следующих полей:\\n - `orderName -> name`\\n - `clientDisplayName -> clientName`\\n - `orderAmount -> amount`\\n - `orderStatus -> status`\\n\\n3. **Нормализация структуры.** \\n Преобразованный объект приводится к нормализованной структуре, пригодной для использования UI-компонентами.\\n\\n4. **Формирование окончательного вывода.** \\n Возвращается нормализованная структура данных.\\n\\n**Альтернативный сценарий (для пустых строковых значений):** \\n- Все пустые строки заменяются на `\\\"\\\"`\\n\\n**Обработка ошибок:** \\n- Внутренние ошибки маппинга фиксируются на уровне trace/debug логирования.\\n\\n**Постусловие:** \\n- Порядок элементов исходного списка сохраняется неизменным.\\n\",\n \"reason\": \"Маппинг модели PPRB в модель UFS\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", + "completed_at": "2026-04-14T12:32:48.704586+00:00" +} +``` diff --git a/runtime_traces/agent_requests/20260414-123804-48a26f1d804d.md b/runtime_traces/agent_requests/20260414-123804-48a26f1d804d.md new file mode 100644 index 0000000..e67b136 --- /dev/null +++ b/runtime_traces/agent_requests/20260414-123804-48a26f1d804d.md @@ -0,0 +1,164 @@ +# Runtime Trace: 20260414-123804-48a26f1d804d + +- active_rag_session_id: 0d8b6e8a-c199-4cb5-82a6-48a26f1d804d + +## request +```json +{ + "request_id": "req_2076be5e40fe49ac83b32b466d52d6c7", + "session_id": "as_f82580c0351240cd8e16de1280145396", + "active_rag_session_id": "0d8b6e8a-c199-4cb5-82a6-48a26f1d804d", + "process_version": "v2", + "created_at": "2026-04-14T12:38:04.589305+00:00", + "message": "Собери документацию из аналитики\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md" +} +``` + +## process.v2 +```json +{ + "event": "intent_routed", + "routing_domain": "DOCS", + "intent": "DOC_UPDATE", + "subintent": "FROM_FEATURE", + "normalized_query": "Собери документацию из аналитики /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "target_terms": [ + "/users/alex/dev_projects_v2/ai" + ], + "anchors": { + "entity_names": [ + "Users", + "Dev_projects_v2" + ], + "file_names": [ + "process/v2/test_doc/features/order_list.md" + ], + "endpoint_paths": [ + "/users/alex/dev_projects_v2/ai" + ], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null, + "scope_type": "entity", + "candidate_domains": [], + "candidate_subdomains": [], + "candidate_entities": [ + "list" + ], + "candidate_apis": [], + "signal_types": [ + "API_ENDPOINT", + "DOMAIN_ENTITY", + "LOGIC_FLOW" + ] + }, + "confidence": 0.9, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "Запрос содержит указание на конкретный md-файл с аналитикой и требует собрать документацию.", + "rag_session_id": "0d8b6e8a-c199-4cb5-82a6-48a26f1d804d" +} +``` + +## process.v2.pipeline +```json +{ + "event": "router_resolved", + "domain": "DOCS", + "intent": "DOC_UPDATE", + "subintent": "FROM_FEATURE", + "confidence": 0.9 +} +``` + +## process.v2.pipeline +```json +{ + "event": "anchors_extracted", + "signal_types": [ + "API_ENDPOINT", + "DOMAIN_ENTITY", + "LOGIC_FLOW" + ], + "endpoint_paths": [ + "/users/alex/dev_projects_v2/ai" + ], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "target_terms": [ + "/users/alex/dev_projects_v2/ai" + ] +} +``` + +## process.v2.pipeline +```json +{ + "event": "alias_resolution", + "resolved_aliases": [], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ] +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_started", + "workflow_id": "v2.docs_update.from_feature_v2" +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_completed", + "workflow_id": "v2.docs_update.from_feature_v2" +} +``` + +## process.v2.pipeline +```json +{ + "event": "answer_generated", + "answer_mode": "docs_update_changeset_v2", + "changeset_items": 3, + "apply_changeset": true +} +``` + +## result +```json +{ + "status": "done", + "answer": "DOC_UPDATE/FROM_FEATURE v2: сформирован changeset.\n\nIssues:\n- Не найден metadata-тег analysis_id в начале аналитики.\n- Пропущен DELETE для docs/orders/web/ui_page/orders.ui.list.md: не найден текущий файл.\n\nTasks:\n- 6.3 create: docs/orders/pprb/api_method/orders.api.pprb.list.md [pprb | api_method]\n- 6.2 create: docs/orders/ufs/api_method/orders.api.ufs.list.md [ufs | api_method]\n- 6.4 create: docs/orders/ufs/logic_block/orders.logic.list.mapping.md [ufs | logic_block]\n- 6.1 delete: docs/orders/web/ui_page/orders.ui.list.md [web | ui_page]\n\nChangeset:\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/orders/pprb/api_method/orders.api.pprb.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.api.pprb.list\\ntitle: Метод PPRB получения списка заказов\\ndoc_type: api_method\\nstatus: create\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.ufs.list\\n - orders.logic.list.mapping\\n - orders.ui.list\\n---\\n\\n## Summary\\n\\nМетод `GET /orders` предназначен для получения списка заказов от UFS с использованием пагинации. Он возвращает JSON-ответ, содержащий массив заказов с информацией о названии, клиенте, сумме и статусе, а также общее количество заказов. Контракт метода включает обязательные параметры запроса, такие как `X-Request-Id`, `page` и `size`. В разделе мониторинга определены ключевые метрики для отслеживания успешных запросов, технических и бизнес-ошибок.\\n\\n## Details\\n\\n## Details\\n\\n### Технический use case\\n1. **Предусловия**: \\n - Пользователь аутентифицирован и авторизован.\\n \\n2. **Триггер**: \\n - Поступает HTTP-запрос типа GET на endpoint `/orders`.\\n\\n3. **Основной сценарий**:\\n - 3.1. Выполняется валидация параметров запроса (обязательные параметры: `X-Request-Id`, `page`, `size`).\\n - 3.2. Выполняется SQL-запрос к базе данных с использованием пагинации.\\n - 3.3. Формируется ответ, содержащий список заказов и общее количество заказов.\\n - 3.4. Возвращается JSON-ответ клиенту.\\n\\n4. **Альтернативный сценарий**:\\n - При отсутствии прав доступа инициируется бизнес-ошибка.\\n\\n5. **Обработка ошибок**:\\n - В случае технических сбоев (например, ошибки базы данных) формируется соответствующий код ошибки и сообщение.\\n\\n6. **Постусловие**:\\n - Запрос обработан успешно или возвращена информация об ошибке.\\n\\n### Функциональные требования\\nФункциональные требования не выявлены для данного метода.\\n\\n### Нефункциональные требования\\n\\n#### Мониторинг\\nМониторинг реализован следующими метриками:\\n\\n| Метрика | Описание | Условие срабатывания |\\n| --------------------------------- | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |\\n| `ORDERS_LIST_PPRB_SUCCESS` | Метрика успешной обработки запроса на стороне PPRB. | Фиксируется при успешном чтении данных из БД и возврате корректного ответа без ошибок. |\\n| `ORDERS_LIST_PPRB_FAIL` | Метрика технической ошибки на стороне PPRB. | Фиксируется при техническом сбое (ошибка БД, таймаут, недоступность инфраструктуры, необработанное исключение, ошибка 5xx). |\\n| `ORDERS_LIST_PPRB_BUSINESS_ERROR` | Метрика бизнес-ошибки доступа на стороне PPRB. | Фиксируется, если проверка ролевой модели завершилась отказом (нет требуемого экшена). |\\n\\nКонтракты метода описаны в разделе Контракт.\\n\",\n \"reason\": \"Метод PPRB получения списка заказов\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders/ufs/api_method/orders.api.ufs.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.api.ufs.list\\ntitle: Метод UFS получения списка заказов\\ndoc_type: api_method\\nstatus: create\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.pprb.list\\n - orders.logic.list.mapping\\n - orders.ui.list\\n---\\n\\n## Summary\\n\\nМетод `GET /api/v1/orders` предназначен для получения списка заказов в системе UFS. Поддерживается пагинация через обязательные параметры запроса `page` и `size`. \\n\\nКлючевые особенности:\\n- Авторизация осуществляется проверкой наличия экшена ролевой модели `Role.Orders.List`.\\n- Производится валидация обязательных параметров запроса, включая уникальный идентификатор запроса `X-Request-Id`.\\n- Результат возвращается в виде JSON с деталями заказов (название, клиент, сумма, статус), а также данными о пагинации.\\n- Реализованы меры аудита и мониторинга для отслеживания успешных запросов, технических и бизнес-ошибок.\\n\\n## Details\\n\\n## Details\\n\\n### Технический use case\\n1. **Предусловия**: \\n - Пользователь аутентифицирован и авторизован на уровне UFS.\\n \\n2. **Триггер**: \\n - Поступает HTTP-запрос типа GET на endpoint `/api/v1/orders`.\\n\\n3. **Основной сценарий**:\\n - 3.1. Выполняется валидация query-параметров (`X-Request-Id`, `page`, `size`), которые являются обязательными.\\n - 3.2. Выполняется проверка наличия экшена ролевой модели `Role.Orders.List` у текущего пользователя.\\n - 3.3. Вызывается метод PPRB `GET /orders` с передачей необходимых параметров пагинации.\\n - 3.4. Полученные данные маппятся в контракт UFS согласно описанному соглашению.\\n - 3.5. Формируется финальный JSON-ответ, который отправляется пользователю.\\n\\n4. **Альтернативный сценарий**:\\n - Если текущий пользователь не обладает необходимым экшеном ролевой модели, инициируется бизнес-ошибка и фиксируется соответствующая метрика аудита.\\n\\n5. **Обработка ошибок**:\\n - В случае возникновения технических проблем (ошибки сети, таймауты, недоступность PPRB-сервиса) возвращается соответствующий статус ошибки HTTP и регистрируется инцидент мониторинга.\\n\\n6. **Постусловие**:\\n - Запрос либо успешно выполнен и вернул корректный ответ, либо зафиксирована ошибка с соответствующей записью в системе мониторинга и аудите.\\n\\n### Контракт метода `GET /api/v1/orders`\\nЗапрос (параметры):\\n\\n| Название | Тип параметра | Тип данных | Обязательность | Описание | Пример |\\n| -------------- | ------------- | ---------- | -------------- | ------------------------------ | -------------------------------------- |\\n| `X-Request-Id` | `header` | `uuid` | 1 | Сквозной идентификатор запроса | `c7f4d8ce-9d6f-4ef9-a7ba-0d6f5ed8f111` |\\n| `page` | `query` | `integer` | 1 | Номер страницы, начиная с 1 | `1` |\\n| `size` | `query` | `integer` | 1 | Размер страницы | `20` |\\n\\nОтвет (JSON):\\n\\n| Название | Тип данных | Обязательность | Описание | Заполнение | Пример |\\n| -------------------- | --------------- | -------------- | ------------------------ | ---------------------------------------- | ------------------------ |\\n| `items` | `array<object>` | 1 | Список заказов | Из `orders[]` ответа PPRB после маппинга | `[{\\\\\\\"name\\\\\\\":\\\\\\\"Заказ-001\\\\\\\"}]` |\\n| `items[].name` | `string` | 1 | Наименование заказа | `orders[].orderName` | `Заказ-001` |\\n| `items[].clientName` | `string` | 1 | Наименование клиента | `orders[].clientDisplayName` | `ООО Ромашка` |\\n| `items[].amount` | `number` | 1 | Сумма заказа | `orders[].orderAmount` | `125000.50` |\\n| `items[].status` | `string` | 1 | Статус заказа | `orders[].orderStatus` | `NEW` |\\n| `pagination.page` | `integer` | 1 | Текущая страница | Из query `page` | `1` |\\n| `pagination.size` | `integer` | 1 | Размер страницы | Из query `size` | `20` |\\n| `pagination.total` | `integer` | 1 | Общее количество записей | `totalCount` из ответа PPRB | `245` |\\n\",\n \"reason\": \"Метод UFS получения списка заказов\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders/ufs/logic_block/orders.logic.list.mapping.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.logic.list.mapping\\ntitle: Маппинг модели PPRB в модель UFS\\ndoc_type: logic_block\\nstatus: create\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.pprb.list\\n - orders.api.ufs.list\\n - orders.ui.list\\n---\\n\\n## Summary\\n\\n- Переход данных осуществляется из модели PPRB в модель UFS с выполнением маппинга полей контракта.\\n- Основные маппинги: `orderName -> name`, `clientDisplayName -> clientName`, `orderAmount -> amount`, `orderStatus -> status`.\\n- Пустые строки преобразуются в пустую строку `\\\" \\\"` без изменения порядка элементов исходного списка.\\n- Не требует аудита и включает мониторинг времени выполнения маппинга на уровне debug/trace.\\n\\n## Details\\n\\n## Details\\n\\n### Технический use case\\n1. **Предусловия:** \\n - Имеется DTO ответа от PPRB.\\n \\n2. **Триггер:** \\n - Запуск процедуры маппинга.\\n\\n3. **Основной сценарий:**\\n - 3.1. Получение DTO ответа от PPRB.\\n - 3.2. Выполнение маппинга полей в соответствии с контрактом UFS:\\n - `orderName -> name`\\n - `clientDisplayName -> clientName`\\n - `orderAmount -> amount`\\n - `orderStatus -> status`\\n - 3.3. Преобразование пустых строковых значений в пустые строки `\\\"\\\"`\\n - 3.4. Сохранение порядка элементов списка без изменений.\\n - 3.5. Возврат нормализованной структуры для представления на UI.\\n\\n4. **Альтернативный сценарий:** \\n - Нет специфических альтернативных сценариев.\\n\\n5. **Обработка ошибок:** \\n - Внутренние ошибки обрабатываются на уровне логики, информируя систему мониторинга.\\n\\n6. **Постусловие:** \\n - Либо структура успешно нормализована и передана, либо произошла внутренняя ошибка с регистрацией инцидента мониторинга.\\n\\n### Контракт\\nМаппинг выполняется следующим образом:\\n\\n| Поле PPRB | Поле UFS |\\n|----------------|----------------|\\n| orderName | name |\\n| clientDisplayName | clientName |\\n| orderAmount | amount |\\n| orderStatus | status |\\n\",\n \"reason\": \"Маппинг модели PPRB в модель UFS\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", + "completed_at": "2026-04-14T12:39:03.564534+00:00" +} +``` diff --git a/runtime_traces/agent_requests/20260414-124623-1c113368d81d.md b/runtime_traces/agent_requests/20260414-124623-1c113368d81d.md new file mode 100644 index 0000000..c66fcee --- /dev/null +++ b/runtime_traces/agent_requests/20260414-124623-1c113368d81d.md @@ -0,0 +1,2638 @@ +# Runtime Trace: 20260414-124623-1c113368d81d + +- active_rag_session_id: 8be58106-7160-4c37-870a-1c113368d81d + +## request +```json +{ + "request_id": "req_8e71bbd7a3844428ab9fdc11ebf6e65f", + "session_id": "as_158aaf3ca2484698810dc2c915f0313f", + "active_rag_session_id": "8be58106-7160-4c37-870a-1c113368d81d", + "process_version": "v2", + "created_at": "2026-04-14T12:46:23.164012+00:00", + "message": "Собери документацию из аналитики\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md" +} +``` + +## process.v2 +```json +{ + "event": "intent_routed", + "routing_domain": "DOCS", + "intent": "DOC_UPDATE", + "subintent": "FROM_FEATURE", + "normalized_query": "Собери документацию из аналитики /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "target_terms": [ + "/users/alex/dev_projects_v2/ai" + ], + "anchors": { + "entity_names": [ + "Users", + "Dev_projects_v2" + ], + "file_names": [ + "process/v2/test_doc/features/order_list.md" + ], + "endpoint_paths": [ + "/users/alex/dev_projects_v2/ai" + ], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null, + "scope_type": "entity", + "candidate_domains": [], + "candidate_subdomains": [], + "candidate_entities": [ + "list" + ], + "candidate_apis": [], + "signal_types": [ + "API_ENDPOINT", + "DOMAIN_ENTITY", + "LOGIC_FLOW" + ] + }, + "confidence": 0.9, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "Запрос на сбор документации из файла аналитики, указан полный путь к файлу order_list.md.", + "rag_session_id": "8be58106-7160-4c37-870a-1c113368d81d" +} +``` + +## process.v2.pipeline +```json +{ + "event": "router_resolved", + "domain": "DOCS", + "intent": "DOC_UPDATE", + "subintent": "FROM_FEATURE", + "confidence": 0.9 +} +``` + +## process.v2.pipeline +```json +{ + "event": "anchors_extracted", + "signal_types": [ + "API_ENDPOINT", + "DOMAIN_ENTITY", + "LOGIC_FLOW" + ], + "endpoint_paths": [ + "/users/alex/dev_projects_v2/ai" + ], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "target_terms": [ + "/users/alex/dev_projects_v2/ai" + ] +} +``` + +## process.v2.pipeline +```json +{ + "event": "alias_resolution", + "resolved_aliases": [], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ] +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_started", + "workflow_id": "v2.docs_update.from_feature_v2" +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step1_resolve_source", + "title": "Определение источника аналитики" + }, + "input": { + "query_excerpt": "Собери документацию из аналитики\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "query_len": 117, + "_context": { + "source_kind": "", + "source_ref": "", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step2_load_source_content", + "title": "Загрузка системной аналитики" + }, + "input": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step3_parse_requirements", + "title": "Парсинг раздела функциональных требований" + }, + "input": { + "source_content_len": 15837, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "analytics_meta": { + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read" + }, + "requirements": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "metadata": { + "id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web" + } + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "metadata": { + "id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs" + } + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "metadata": { + "id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb" + } + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "metadata": { + "id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs" + } + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step4_prepare_tasks", + "title": "Подготовка задач по страницам документации" + }, + "input": { + "requirements_count": 4, + "requirements": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "metadata": { + "id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web" + } + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "metadata": { + "id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs" + } + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "metadata": { + "id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb" + } + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "metadata": { + "id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs" + } + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "docs_catalog_rows_count": 9, + "tasks": [ + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "doc_id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "doc_id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "doc_id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "doc_id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step5_load_rules", + "title": "Загрузка правил документации v3" + }, + "input": { + "rules_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/_process/doc_rules_v3", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "rules_count": 18, + "rule_names": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md", + "common-elements/user-analytics.md", + "documentation-rules.md", + "global/analytics-to-doc.md", + "global/filepaths.md", + "global/frontmatter.md", + "global/header-rules.md", + "global/layer-responsibility.md", + "templates/api_method.template.md", + "templates/logic_block.template.md", + "templates/ui_page.template.md" + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 18, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md" + ], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step6_execute_subprocesses", + "title": "Выполнение подпроцессов create/edit/delete" + }, + "input": { + "tasks": [ + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block" + }, + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page" + } + ], + "rules_count": 18, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 18, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md" + ], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "changeset": [ + { + "op": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "reason": "Метод PPRB получения списка заказов" + }, + { + "op": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "reason": "Метод UFS получения списка заказов" + }, + { + "op": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "reason": "Маппинг модели PPRB в модель UFS" + }, + { + "op": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "reason": "Страница списка заказов" + } + ], + "accumulated_pages": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_id": "orders.api.pprb.list", + "doc_type": "api_method", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_id": "orders.api.ufs.list", + "doc_type": "api_method", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_id": "orders.ui.list", + "doc_type": "ui_page", + "action": "create" + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 18, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step7_finalize", + "title": "Формирование итогового ответа" + }, + "input": { + "tasks_count": 4, + "changeset_count": 4, + "issues_count": 1, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 18, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "answer_generated_payload": { + "answer_mode": "docs_update_changeset_v2", + "changeset_items": 4, + "apply_changeset": true + }, + "answer_len": 14920, + "apply_changeset": true, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 18, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": true, + "answer_len": 14920, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_trace_flushed", + "workflow_id": "v2.docs_update.from_feature_v2", + "steps": [ + { + "step_id": "step1_resolve_source", + "title": "Определение источника аналитики", + "input": { + "query_excerpt": "Собери документацию из аналитики\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "query_len": 117, + "_context": { + "source_kind": "", + "source_ref": "", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + } + }, + { + "step_id": "step2_load_source_content", + "title": "Загрузка системной аналитики", + "input": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + } + }, + { + "step_id": "step3_parse_requirements", + "title": "Парсинг раздела функциональных требований", + "input": { + "source_content_len": 15837, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "analytics_meta": { + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read" + }, + "requirements": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "metadata": { + "id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web" + } + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "metadata": { + "id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs" + } + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "metadata": { + "id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb" + } + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "metadata": { + "id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs" + } + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } + }, + { + "step_id": "step4_prepare_tasks", + "title": "Подготовка задач по страницам документации", + "input": { + "requirements_count": 4, + "requirements": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "metadata": { + "id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web" + } + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "metadata": { + "id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs" + } + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "metadata": { + "id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb" + } + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "metadata": { + "id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs" + } + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "docs_catalog_rows_count": 9, + "tasks": [ + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "doc_id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "doc_id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "doc_id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "doc_id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } + }, + { + "step_id": "step5_load_rules", + "title": "Загрузка правил документации v3", + "input": { + "rules_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/_process/doc_rules_v3", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "rules_count": 18, + "rule_names": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md", + "common-elements/user-analytics.md", + "documentation-rules.md", + "global/analytics-to-doc.md", + "global/filepaths.md", + "global/frontmatter.md", + "global/header-rules.md", + "global/layer-responsibility.md", + "templates/api_method.template.md", + "templates/logic_block.template.md", + "templates/ui_page.template.md" + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 18, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md" + ], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } + }, + { + "step_id": "step6_execute_subprocesses", + "title": "Выполнение подпроцессов create/edit/delete", + "input": { + "tasks": [ + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block" + }, + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page" + } + ], + "rules_count": 18, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 18, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md" + ], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "changeset": [ + { + "op": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "reason": "Метод PPRB получения списка заказов" + }, + { + "op": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "reason": "Метод UFS получения списка заказов" + }, + { + "op": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "reason": "Маппинг модели PPRB в модель UFS" + }, + { + "op": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "reason": "Страница списка заказов" + } + ], + "accumulated_pages": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_id": "orders.api.pprb.list", + "doc_type": "api_method", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_id": "orders.api.ufs.list", + "doc_type": "api_method", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_id": "orders.ui.list", + "doc_type": "ui_page", + "action": "create" + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 18, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } + }, + { + "step_id": "step7_finalize", + "title": "Формирование итогового ответа", + "input": { + "tasks_count": 4, + "changeset_count": 4, + "issues_count": 1, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 18, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "answer_generated_payload": { + "answer_mode": "docs_update_changeset_v2", + "changeset_items": 4, + "apply_changeset": true + }, + "answer_len": 14920, + "apply_changeset": true, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 18, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": true, + "answer_len": 14920, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } + } + ] +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_completed", + "workflow_id": "v2.docs_update.from_feature_v2" +} +``` + +## process.v2.pipeline +```json +{ + "event": "answer_generated", + "answer_mode": "docs_update_changeset_v2", + "changeset_items": 4, + "apply_changeset": true +} +``` + +## result +```json +{ + "status": "done", + "answer": "DOC_UPDATE/FROM_FEATURE v2: сформирован changeset.\n\nIssues:\n- Не найден metadata-тег analysis_id в начале аналитики.\n\nTasks:\n- 6.3 create: docs/orders/pprb/api_method/orders.api.pprb.list.md [pprb | api_method]\n- 6.2 create: docs/orders/ufs/api_method/orders.api.ufs.list.md [ufs | api_method]\n- 6.4 create: docs/orders/ufs/logic_block/orders.logic.list.mapping.md [ufs | logic_block]\n- 6.1 create: docs/orders/web/ui_page/orders.ui.list.md [web | ui_page]\n\nChangeset:\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/orders/pprb/api_method/orders.api.pprb.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.api.pprb.list\\ntitle: Метод PPRB получения списка заказов\\ndoc_type: api_method\\nstatus: create\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - docs/orders/ufs/api_method/orders.api.ufs.list.md\\n - docs/orders/ufs/logic_block/orders.logic.list.mapping.md\\n - docs/orders/web/ui_page/orders.ui.list.md\\n---\\n\\n## Summary\\n\\n- Метод PPRB получения списка заказов реализуется через endpoint `GET /orders`.\\n- Поддерживается пагинация с указанием номера страницы (`page`) и размера страницы (`size`).\\n- Каждый запрос должен содержать уникальный идентификатор `X-Request-Id`.\\n- В ответ возвращаются список заказов с основными параметрами (название, клиент, сумма, статус) и общее количество заказов.\\n- Реализованы метрики мониторинга успешных запросов, технических и бизнес-ошибок.\\n\\n## Details\\n\\n### Технический use case\\n\\n**Название:** Метод PPRB получения списка заказов \\n**Предусловия:** \\n\\n- Запрос от UFS поступил на endpoint `/orders`.\\n- Запрос содержит обязательные параметры `X-Request-Id`, `page`, `size`.\\n\\n**Триггер:** Получен HTTP-запрос типа GET на endpoint `/orders`.\\n\\n**Основной сценарий:**\\n\\n1. Выполняется проверка наличия обязательных параметров запроса (шаг детализирован в FR).\\n2. Выполняется пагинация и фильтрация данных о заказах из базы данных (шаг детализирован в FR).\\n3. Формируется ответ, включающий список заказов и общее количество записей (шаг детализирован в FR).\\n4. Ответ отправляется клиенту.\\n\\n**Альтернативный сценарий (в случае ошибки):**\\n\\n- При отсутствии обязательных параметров или ошибке в значениях параметров формируется соответствующий код ошибки и сообщение об ошибке.\\n- В случае возникновения технических проблем (например, проблемы с базой данных) возвращается статус ошибки с описанием причины.\\n\\n**Постусловия:** \\n\\n- Клиенту возвращён список заказов вместе с общим количеством доступных записей либо информация об ошибке.\\n\\n### Функциональные требования\\n\\nFR.1. **Проверка обязательных параметров запроса:** \\n- Проверяется наличие всех обязательных параметров (`X-Request-Id`, `page`, `size`) в запросе.\\n- При отсутствии хотя бы одного обязательного параметра вызывается ошибка с указанием недостающего параметра.\\n\\nFR.2. **Выполнение пагинации и фильтрации данных:**\\n- Реализована функциональность пагинации результатов согласно параметрам `page` и `size`.\\n- Выполняется SQL-запрос с использованием LIMIT-OFFSET подхода.\\n\\nFR.3. **Формирование и отправка ответа:**\\n- Список заказов формируется в виде JSON-объекта, содержащего массив заказов с полями `orderName`, `clientDisplayName`, `orderAmount`, `orderStatus` и поле `totalCount`.\\n- Ответ отправляется с HTTP-кодом 200 OK при успешном выполнении запроса.\\n\\n### Нефункциональные требования\\n\\n#### Мониторинг\\n\\nМониторинг осуществляется посредством следующих метрик:\\n\\n| Метрика | Описание | Условие срабатывания |\\n| --------------------------------- | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |\\n| `ORDERS_LIST_PPRB_SUCCESS` | Метрика успешной обработки запроса на стороне PPRB. | Фиксируется при успешном чтении данных из БД и возврате корректного ответа без ошибок. |\\n| `ORDERS_LIST_PPRB_FAIL` | Метрика технической ошибки на стороне PPRB. | Фиксируется при техническом сбое (ошибка БД, таймаут, недоступность инфраструктуры, необработанное исключение, ошибка 5xx). |\\n| `ORDERS_LIST_PPRB_BUSINESS_ERROR` | Метрика бизнес-ошибки доступа на стороне PPRB. | Фиксируется, если проверка ролевой модели завершилась отказом (нет требуемого экшена). |\\n\",\n \"reason\": \"Метод PPRB получения списка заказов\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders/ufs/api_method/orders.api.ufs.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.api.ufs.list\\ntitle: Метод UFS получения списка заказов\\ndoc_type: api_method\\nstatus: create\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - docs/orders/pprb/api_method/orders.api.pprb.list.md\\n - docs/orders/ufs/logic_block/orders.logic.list.mapping.md\\n - docs/orders/web/ui_page/orders.ui.list.md\\n---\\n\\n## Summary\\n\\n- Метод UFS получения списка заказов обрабатывает запросы типа `GET /api/v1/orders`.\\n- Выполняет валидацию query-параметров и проверяет наличие экшена ролевой модели `Role.Orders.List` для авторизации пользователя.\\n- Интегрируется с методом PPRB `GET /orders` для получения данных.\\n- Отвечает UI, предоставляя список заказов с информацией о названии, клиенте, сумме и статусе заказа.\\n- Реализует аудит и мониторинг выполнения операций, включая успешные запросы, технические и бизнес-ошибки.\\n\\n## Details\\n\\n## Details\\n\\n### Технический use case\\n\\n**Название:** Метод UFS получения списка заказов \\n**Предусловия:**\\n\\n- Пользователь выполнил запрос на получение списка заказов через UI.\\n- Запрос был валидирован и передан на уровень UFS.\\n\\n**Триггер:** \\n\\nПолучен HTTP-запрос типа GET на endpoint `/api/v1/orders`.\\n\\n**Основной сценарий:**\\n\\n1. Выполняется проверка обязательных header- и query-параметров запроса (шаг детализирован в FR).\\n2. Проверяется наличие необходимого экшена ролевой модели `Role.Orders.List` у текущего пользователя (шаг детализирован в FR).\\n3. Выполняется вызов метода PPRB для получения списка заказов (шаг детализирован в FR).\\n4. Результат вызова PPRB маппится в контракт UFS и возвращается UI.\\n\\n**Альтернативный сценарий (в случае ошибки):**\\n\\n- При отсутствии обязательных параметров или ошибке в значениях параметров формируется соответствующий код ошибки и сообщение об ошибке.\\n- В случае отсутствия у пользователя нужного экшена ролевой модели возвращается статус ошибки с указанием на отсутствие доступа.\\n- В случае возникновения технических проблем (например, проблемы с вызовом PPRB) возвращается статус ошибки с описанием причины.\\n\\n**Постусловия:** \\n\\n- Клиенту возвращён список заказов в формате контракта UFS либо информация об ошибке.\\n\\n### Функциональные требования\\n\\nFR.1. **Проверка обязательных параметров запроса:**\\n\\n- Проверяется наличие всех обязательных параметров (`X-Request-Id`, `page`, `size`) в запросе.\\n- При отсутствии хотя бы одного обязательного параметра вызывается ошибка с указанием недостающего параметра.\\n\\nFR.2. **Авторизация и проверка прав доступа:**\\n\\n- Проверяется наличие у текущего пользователя экшена ролевой модели `Role.Orders.List`.\\n- При отсутствии необходимых прав доступ блокируется с возвратом ошибки доступа.\\n\\nFR.3. **Интеграция с методом PPRB:**\\n\\n- Выполняется HTTP-запрос типа GET на endpoint `/orders` с передачей соответствующих параметров.\\n- Осуществляется обработка результата вызова PPRB, включая маппинг полей в формат контракта UFS.\\n\\n### Нефункциональные требования\\n\\n#### Аудит\\n\\nАудиторские записи оформляются следующим образом:\\n\\n| Код события | Описание события | Логируемые атрибуты |\\n|-------------------------|----------------------------------------------|---------------------------------------------------------|\\n| `ORDERS_LIST_REQUESTED` | Вызов метода получения списка заказов в UFS. | `requestId`, `userId`, `page`, `size`, `responseCode` |\\n\\n#### Мониторинг\\n\\nМониторинг осуществляется посредством следующих метрик:\\n\\n| Метрика | Описание | Условие срабатывания |\\n|----------------------------------|-----------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------|\\n| `ORDERS_LIST_UFS_SUCCESS` | Метрика успешной обработки запроса на получение списка заказов. | Фиксируется при успешном завершении сценария и возврате корректного ответа без ошибок. |\\n| `ORDERS_LIST_UFS_FAIL` | Метрика технической ошибки при обработке запроса. | Фиксируется при техническом сбое (ошибка сети, таймаут, необработанное исключение, недоступность зависимого сервиса, ошибка 5xx). |\\n| `ORDERS_LIST_UFS_BUSINESS_ERROR` | Метрика бизнес-ошибки доступа. | Фиксируется, если у пользователя отсутствует экшен ролевой модели `Role.Orders.List`. |\\n\",\n \"reason\": \"Метод UFS получения списка заказов\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders/ufs/logic_block/orders.logic.list.mapping.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.logic.list.mapping\\ntitle: Маппинг модели PPRB в модель UFS\\ndoc_type: logic_block\\nstatus: create\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - docs/orders/pprb/api_method/orders.api.pprb.list.md\\n - docs/orders/ufs/api_method/orders.api.ufs.list.md\\n - docs/orders/web/ui_page/orders.ui.list.md\\n---\\n\\n## Summary\\n\\n- Реализован маппинг полей модели PPRB в контракт UFS для дальнейшего использования в UI.\\n- Ключевые маппинги включают переназначение полей `orderName -> name`, `clientDisplayName -> clientName`, `orderAmount -> amount`, `orderStatus -> status`.\\n- Обеспечено возвращение пустой строки для пустых строковых значений.\\n- Порядок элементов исходного списка сохраняется без изменений.\\n- Исключен аудит для данного переиспользуемого внутреннего блока.\\n- Включен мониторинг времени выполнения маппинга на уровне log-трассировки.\\n\\n## Details\\n\\n## Details\\n\\n### Технический use case\\n\\n**Название:** Маппинг модели PPRB в модель UFS \\n**Предусловия:** \\n\\n- Получен DTO ответа из PPRB.\\n- Поступил запрос на выполнение маппинга полей в контракт UFS.\\n\\n**Триггер:** Запуск процедуры маппинга.\\n\\n**Основной сценарий:**\\n\\n1. Выполняется преобразование полей `orderName`, `clientDisplayName`, `orderAmount`, `orderStatus` соответственно в `name`, `clientName`, `amount`, `status`.\\n2. Проводится проверка на пустые строковые значения, которые заменяются на `\\\"\\\"`\\n3. Сохраняется исходный порядок элементов списка.\\n4. Возвращается нормализованная структура данных для UI.\\n\\n**Альтернативный сценарий (в случае ошибки):**\\n\\n- В случае несоответствия формата входных данных или невозможности выполнить маппинг генерируется соответствующая ошибка.\\n\\n**Постусловия:** \\n\\n- Вернута нормализованная структура данных для представления пользователю.\\n\\n### Функциональные требования\\n\\nFR.1. **Реализовать маппинг полей:**\\n\\n- Поля `orderName`, `clientDisplayName`, `orderAmount`, `orderStatus` должны быть преобразованы в `name`, `clientName`, `amount`, `status` соответственно.\\n\\nFR.2. **Отображение пустых строковых значений:**\\n\\n- Все пустые строковые значения должны возвращаться как `\\\"\\\"`.\\n\\nFR.3. **Порядок элементов списка:**\\n\\n- Порядок элементов списка должен сохраняться неизменным после маппинга.\\n\\n### Нефункциональные требования\\n\\n#### Мониторинг\\n\\nМониторинг времени выполнения маппинга должен осуществляться с уровнем логирования `debug/trace`.\\n\",\n \"reason\": \"Маппинг модели PPRB в модель UFS\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders/web/ui_page/orders.ui.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.ui.list\\ntitle: Страница списка заказов\\ndoc_type: ui_page\\nstatus: create\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - docs/orders/pprb/api_method/orders.api.pprb.list.md\\n - docs/orders/ufs/api_method/orders.api.ufs.list.md\\n - docs/orders/ufs/logic_block/orders.logic.list.mapping.md\\n---\\n\\n## Summary\\n\\n- Страница списка заказов представляет собой UI-компонент, обеспечивающий просмотр заказов пользователей.\\n- Основные элементы отображаемой таблицы: наименование, клиент, сумма и статус заказа.\\n- Реализована поддержка пагинации с возможностью изменения номера и размера страницы.\\n- Предусмотрены состояния для пустого списка (\\\"Записи отсутствуют\\\") и ошибки загрузки с возможностью повтора запроса.\\n- Соблюдены требования к пользовательской аналитике, ведется учет событий открытия страницы и смены страниц пагинации.\\n\\n## Details\\n\\n## Details\\n\\n### Технический use case\\n**Название:** Страница списка заказов \\n**Предусловия:** \\n\\n- Пользователь аутентифицировался и имеет право на просмотр списка заказов.\\n\\n**Триггер:** \\nПользователь переходит на страницу списка заказов.\\n\\n**Основной сценарий:**\\n\\n1. UI отправляет первый запрос на получение списка заказов с параметрами `page=1` и `size=20`.\\n2. Получив ответ, UI отображает полученные заказы в виде таблицы.\\n3. Пользователь выбирает другую страницу в интерфейсе пагинации.\\n4. UI отправляет новый запрос на получение списка заказов с обновленными параметрами пагинации.\\n\\n**Альтернативный сценарий (в случае отсутствия данных):**\\n\\n- При отсутствии данных отображается заглушка с иконкой пустого лотка и сообщением «Записи отсутствуют».\\n\\n**Альтернативный сценарий (при возникновении ошибки):**\\n\\n- При неудачном получении данных отображается заглушка ошибки с иконкой и текстом ошибки. Также доступна кнопка «Повторить», позволяющая повторить попытку загрузки данных.\\n\\n**Постусловия:** \\n\\n- Данные успешно загружены и отображаются в виде таблицы.\\n- Либо отображается заглушка пустого состояния («Записи отсутствуют»).\\n- Либо отображается заглушка ошибки с возможностью повтора запроса.\\n\\n### Требования к UI\\nПолное описание требований к UI представлено отдельно в соответствии с правилами файла `common-elements/ui-requirements.md`.\\n\\n### Функциональные требования\\nФункциональные требования подробно описаны в разделе «Функциональные требования» текущего документа.\\n\\n### Нефункциональные требования\\nНефункциональные требования детально представлены в разделе «Нефункциональные требования» текущего документа.\\n\",\n \"reason\": \"Страница списка заказов\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", + "completed_at": "2026-04-14T12:47:38.567127+00:00" +} +``` diff --git a/runtime_traces/agent_requests/20260414-131913-a3d17a641da2.md b/runtime_traces/agent_requests/20260414-131913-a3d17a641da2.md new file mode 100644 index 0000000..d6cc8cb --- /dev/null +++ b/runtime_traces/agent_requests/20260414-131913-a3d17a641da2.md @@ -0,0 +1,2650 @@ +# Runtime Trace: 20260414-131913-a3d17a641da2 + +- active_rag_session_id: 85cdd342-13e2-4f1f-8a05-a3d17a641da2 + +## request +```json +{ + "request_id": "req_6c3fea4aa2f74fec816be8fa5bd988c4", + "session_id": "as_852a614bc9ea435f9ddbc25a0e4ab82f", + "active_rag_session_id": "85cdd342-13e2-4f1f-8a05-a3d17a641da2", + "process_version": "v2", + "created_at": "2026-04-14T13:19:13.661870+00:00", + "message": "Собери документацию из аналитики\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md" +} +``` + +## process.v2 +```json +{ + "event": "intent_routed", + "routing_domain": "DOCS", + "intent": "DOC_UPDATE", + "subintent": "FROM_FEATURE", + "normalized_query": "Собери документацию из аналитики /Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "target_terms": [ + "/users/alex/dev_projects_v2/ai" + ], + "anchors": { + "entity_names": [ + "Users", + "Dev_projects_v2" + ], + "file_names": [ + "process/v2/test_doc/features/order_list.md" + ], + "endpoint_paths": [ + "/users/alex/dev_projects_v2/ai" + ], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null, + "scope_type": "entity", + "candidate_domains": [], + "candidate_subdomains": [], + "candidate_entities": [ + "list" + ], + "candidate_apis": [], + "signal_types": [ + "API_ENDPOINT", + "DOMAIN_ENTITY", + "LOGIC_FLOW" + ] + }, + "confidence": 0.9, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "Запрос содержит указание на конкретный md-файл с аналитикой и требует собрать документацию.", + "rag_session_id": "85cdd342-13e2-4f1f-8a05-a3d17a641da2" +} +``` + +## process.v2.pipeline +```json +{ + "event": "router_resolved", + "domain": "DOCS", + "intent": "DOC_UPDATE", + "subintent": "FROM_FEATURE", + "confidence": 0.9 +} +``` + +## process.v2.pipeline +```json +{ + "event": "anchors_extracted", + "signal_types": [ + "API_ENDPOINT", + "DOMAIN_ENTITY", + "LOGIC_FLOW" + ], + "endpoint_paths": [ + "/users/alex/dev_projects_v2/ai" + ], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "target_terms": [ + "/users/alex/dev_projects_v2/ai" + ] +} +``` + +## process.v2.pipeline +```json +{ + "event": "alias_resolution", + "resolved_aliases": [], + "target_doc_hints": [ + "/users/alex/dev_projects_v2/ai", + "users-alex-dev_projects_v2-ai", + "users-alex-dev_projects_v2-ai-endpoint", + "users-alex-dev_projects_v2-ai endpoint", + "ai", + "ai-endpoint", + "ai endpoint", + "docs/logic/telegram-notification-loop.md" + ] +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_started", + "workflow_id": "v2.docs_update.from_feature_v2" +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step1_resolve_source", + "title": "Определение источника аналитики" + }, + "input": { + "query_excerpt": "Собери документацию из аналитики\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "query_len": 117, + "_context": { + "source_kind": "", + "source_ref": "", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step2_load_source_content", + "title": "Загрузка системной аналитики" + }, + "input": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step3_parse_requirements", + "title": "Парсинг раздела функциональных требований" + }, + "input": { + "source_content_len": 15837, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "analytics_meta": { + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read" + }, + "requirements": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "metadata": { + "id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web" + } + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "metadata": { + "id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs" + } + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "metadata": { + "id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb" + } + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "metadata": { + "id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs" + } + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step4_prepare_tasks", + "title": "Подготовка задач по страницам документации" + }, + "input": { + "requirements_count": 4, + "requirements": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "metadata": { + "id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web" + } + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "metadata": { + "id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs" + } + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "metadata": { + "id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb" + } + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "metadata": { + "id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs" + } + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "docs_catalog_rows_count": 9, + "tasks": [ + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "doc_id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "doc_id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "doc_id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "doc_id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step5_load_rules", + "title": "Загрузка правил документации v3" + }, + "input": { + "rules_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/_process/doc_rules_v3", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "rules_count": 24, + "rule_names": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/sql-example.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md", + "common-elements/user-analytics.md", + "documentation-rules.md", + "global/analytics-to-doc.md", + "global/filepaths.md", + "global/frontmatter.md", + "global/header-rules.md", + "global/layer-responsibility.md", + "templates/api_method.template.md", + "templates/db_table.template.md", + "templates/logic_block.template.md", + "templates/ui_page.template.md" + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 24, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md" + ], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step6_execute_subprocesses", + "title": "Выполнение подпроцессов create/edit/delete" + }, + "input": { + "tasks": [ + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block" + }, + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page" + } + ], + "rules_count": 24, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 24, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md" + ], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "changeset": [ + { + "op": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "reason": "Метод PPRB получения списка заказов" + }, + { + "op": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "reason": "Метод UFS получения списка заказов" + }, + { + "op": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "reason": "Маппинг модели PPRB в модель UFS" + }, + { + "op": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "reason": "Страница списка заказов" + } + ], + "accumulated_pages": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_id": "orders.api.pprb.list", + "doc_type": "api_method", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_id": "orders.api.ufs.list", + "doc_type": "api_method", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_id": "orders.ui.list", + "doc_type": "ui_page", + "action": "create" + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 24, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_step_traced", + "workflow_id": "v2.docs_update.from_feature_v2", + "step": { + "id": "step7_finalize", + "title": "Формирование итогового ответа" + }, + "input": { + "tasks_count": 4, + "changeset_count": 4, + "issues_count": 1, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 24, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "answer_generated_payload": { + "answer_mode": "docs_update_changeset_v2", + "changeset_items": 4, + "apply_changeset": true + }, + "answer_len": 24752, + "apply_changeset": true, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 24, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": true, + "answer_len": 24752, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_trace_flushed", + "workflow_id": "v2.docs_update.from_feature_v2", + "steps": [ + { + "step_id": "step1_resolve_source", + "title": "Определение источника аналитики", + "input": { + "query_excerpt": "Собери документацию из аналитики\n/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "query_len": 117, + "_context": { + "source_kind": "", + "source_ref": "", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + } + }, + { + "step_id": "step2_load_source_content", + "title": "Загрузка системной аналитики", + "input": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "", + "source_content_len": 0, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + } + }, + { + "step_id": "step3_parse_requirements", + "title": "Парсинг раздела функциональных требований", + "input": { + "source_content_len": 15837, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "", + "sub_domain": "", + "requirements_count": 0, + "requirements_preview": [], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 0, + "issues_preview": [] + } + }, + "output": { + "analytics_meta": { + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read" + }, + "requirements": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "metadata": { + "id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web" + } + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "metadata": { + "id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs" + } + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "metadata": { + "id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb" + } + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "metadata": { + "id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs" + } + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } + }, + { + "step_id": "step4_prepare_tasks", + "title": "Подготовка задач по страницам документации", + "input": { + "requirements_count": 4, + "requirements": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "metadata": { + "id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web" + } + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "metadata": { + "id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs" + } + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "metadata": { + "id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb" + } + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "metadata": { + "id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs" + } + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 0, + "tasks_count": 0, + "tasks_preview": [], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "docs_catalog_rows_count": 9, + "tasks": [ + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "doc_id": "orders.api.pprb.list", + "doc_type": "api_method", + "application": "orders_pprb", + "platform": "pprb", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "doc_id": "orders.api.ufs.list", + "doc_type": "api_method", + "application": "orders_ufs", + "platform": "ufs", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "doc_id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "application": "orders_ufs", + "platform": "ufs", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "doc_id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web", + "domain": "orders", + "sub_domain": "list_read", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } + }, + { + "step_id": "step5_load_rules", + "title": "Загрузка правил документации v3", + "input": { + "rules_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/_process/doc_rules_v3", + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 0, + "rule_names_preview": [], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "rules_count": 24, + "rule_names": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md", + "common-elements/nfr.md", + "common-elements/sql-example.md", + "common-elements/summary.md", + "common-elements/tech-use-case.md", + "common-elements/ui-requirements.md", + "common-elements/user-analytics.md", + "documentation-rules.md", + "global/analytics-to-doc.md", + "global/filepaths.md", + "global/frontmatter.md", + "global/header-rules.md", + "global/layer-responsibility.md", + "templates/api_method.template.md", + "templates/db_table.template.md", + "templates/logic_block.template.md", + "templates/ui_page.template.md" + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 24, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md" + ], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } + }, + { + "step_id": "step6_execute_subprocesses", + "title": "Выполнение подпроцессов create/edit/delete", + "input": { + "tasks": [ + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block" + }, + { + "section_key": "6.1", + "heading": "Страница списка заказов", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page" + } + ], + "rules_count": 24, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 24, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md" + ], + "changeset_count": 0, + "changeset_preview": [], + "accumulated_pages_count": 0, + "accumulated_pages_preview": [], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "changeset": [ + { + "op": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "reason": "Метод PPRB получения списка заказов" + }, + { + "op": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "reason": "Метод UFS получения списка заказов" + }, + { + "op": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "reason": "Маппинг модели PPRB в модель UFS" + }, + { + "op": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "reason": "Страница списка заказов" + } + ], + "accumulated_pages": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_id": "orders.api.pprb.list", + "doc_type": "api_method", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_id": "orders.api.ufs.list", + "doc_type": "api_method", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_id": "orders.logic.list.mapping", + "doc_type": "logic_block", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_id": "orders.ui.list", + "doc_type": "ui_page", + "action": "create" + } + ], + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 24, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } + }, + { + "step_id": "step7_finalize", + "title": "Формирование итогового ответа", + "input": { + "tasks_count": 4, + "changeset_count": 4, + "issues_count": 1, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 24, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": false, + "answer_len": 0, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + }, + "output": { + "answer_generated_payload": { + "answer_mode": "docs_update_changeset_v2", + "changeset_items": 4, + "apply_changeset": true + }, + "answer_len": 24752, + "apply_changeset": true, + "_context": { + "source_kind": "markdown_file", + "source_ref": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features/order_list.md", + "project_root": "/Users/alex/Dev_projects_v2/ai driven app process/v2/test_doc/features", + "source_content_len": 15837, + "analysis_id": "", + "application": "", + "platform": "", + "domain": "orders", + "sub_domain": "list_read", + "requirements_count": 4, + "requirements_preview": [ + { + "section_key": "6.1", + "heading": "Страница списка заказов" + }, + { + "section_key": "6.2", + "heading": "Метод UFS получения списка заказов" + }, + { + "section_key": "6.3", + "heading": "Метод PPRB получения списка заказов" + }, + { + "section_key": "6.4", + "heading": "Маппинг модели PPRB в модель UFS" + } + ], + "docs_rows_count": 9, + "tasks_count": 4, + "tasks_preview": [ + { + "section_key": "6.3", + "action": "create", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "doc_type": "api_method", + "platform": "pprb" + }, + { + "section_key": "6.2", + "action": "create", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "doc_type": "api_method", + "platform": "ufs" + }, + { + "section_key": "6.4", + "action": "create", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "doc_type": "logic_block", + "platform": "ufs" + }, + { + "section_key": "6.1", + "action": "create", + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "doc_type": "ui_page", + "platform": "web" + } + ], + "rules_count": 24, + "rule_names_preview": [ + "README.md", + "common-elements/api-contract.md", + "common-elements/db-columns.md", + "common-elements/db-constraints.md", + "common-elements/db-purpose.md", + "common-elements/db-usage.md", + "common-elements/details.md", + "common-elements/fr.md" + ], + "changeset_count": 4, + "changeset_preview": [ + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md" + }, + { + "op": "ChangeOp.CREATE", + "path": "docs/orders/web/ui_page/orders.ui.list.md" + } + ], + "accumulated_pages_count": 4, + "accumulated_pages_preview": [ + { + "path": "docs/orders/pprb/api_method/orders.api.pprb.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/api_method/orders.api.ufs.list.md", + "action": "create" + }, + { + "path": "docs/orders/ufs/logic_block/orders.logic.list.mapping.md", + "action": "create" + }, + { + "path": "docs/orders/web/ui_page/orders.ui.list.md", + "action": "create" + } + ], + "apply_changeset": true, + "answer_len": 24752, + "issues_count": 1, + "issues_preview": [ + "Не найден metadata-тег analysis_id в начале аналитики." + ] + } + } + } + ] +} +``` + +## workflow.v2.docs_update.from_feature_v2 +```json +{ + "event": "workflow_completed", + "workflow_id": "v2.docs_update.from_feature_v2" +} +``` + +## process.v2.pipeline +```json +{ + "event": "answer_generated", + "answer_mode": "docs_update_changeset_v2", + "changeset_items": 4, + "apply_changeset": true +} +``` + +## result +```json +{ + "status": "done", + "answer": "DOC_UPDATE/FROM_FEATURE v2: сформирован changeset.\n\nIssues:\n- Не найден metadata-тег analysis_id в начале аналитики.\n\nTasks:\n- 6.3 create: docs/orders/pprb/api_method/orders.api.pprb.list.md [pprb | api_method]\n- 6.2 create: docs/orders/ufs/api_method/orders.api.ufs.list.md [ufs | api_method]\n- 6.4 create: docs/orders/ufs/logic_block/orders.logic.list.mapping.md [ufs | logic_block]\n- 6.1 create: docs/orders/web/ui_page/orders.ui.list.md [web | ui_page]\n\nChangeset:\n```json\n[\n {\n \"op\": \"create\",\n \"path\": \"docs/orders/pprb/api_method/orders.api.pprb.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.api.pprb.list\\ntitle: Метод PPRB получения списка заказов\\ndoc_type: api_method\\nstatus: draft\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.ufs.list\\n - orders.logic.list.mapping\\n - orders.ui.list\\n---\\n\\n# Метод PPRB получения списка заказов\\n\\n## Summary\\n\\n- Документ описывает метод PPRB для получения списка заказов.\\n- Используется HTTP-метод GET с маршрутом `/orders`.\\n- Контракт включает обязательные параметры `X-Request-Id`, `page`, `size`.\\n- В ответ возвращаются список заказов с деталями (название, клиент, сумма, статус) и общее количество заказов.\\n- Реализованы метрики мониторинга успешных запросов, технических и бизнес-ошибок.\\n\\n## Details\\n\\n### Технический use case\\n\\n### Технический use case\\n\\n**Название:** Метод PPRB получения списка заказов \\n\\n**Предусловия:** \\n- Пользователь прошел аутентификацию и авторизацию в системе.\\n- Запрос содержит корректные параметры пагинации (`page`, `size`) и уникальный идентификатор запроса (`X-Request-Id`).\\n\\n**Триггер:** Получен HTTP-запрос типа GET на endpoint `/orders`.\\n\\n**Основной сценарий:**\\n1. Валидация обязательных параметров запроса: `X-Request-Id`, `page`, `size`.\\n2. Формирование SQL-запроса с учетом пагинации и фильтрации.\\n3. Выполнение SQL-запроса к базе данных.\\n4. Получение списка заказов и общего количества записей.\\n5. Преобразование полученных данных в формат JSON.\\n6. Возврат клиенту списка заказов и общего количества записей.\\n\\n**Альтернативный сценарий:** \\n- При отсутствии фильтров или дополнительных условий запрос выполняется без них.\\n\\n**Обработка ошибок:** \\n- В случае некорректных параметров запроса возвращается ошибка 400 Bad Request.\\n- При ошибке выполнения SQL-запроса (например, таймаут, ошибка базы данных) фиксируется метрика `ORDERS_LIST_PPRB_FAIL` и возвращается ошибка 500 Internal Server Error.\\n- Если проверка ролевой модели завершается отказом, фиксируется метрика `ORDERS_LIST_PPRB_BUSINESS_ERROR` и возвращается ошибка 403 Forbidden.\\n\\n**Постусловие:** \\n- Результат успешно возвращен клиенту, зафиксирована метрика `ORDERS_LIST_PPRB_SUCCESS`.\\n\\n### Функциональные требования\\n\\nFR.1. Получение и валидация параметров\\n- Входящий HTTP-запрос типа GET обрабатывается роутером API.\\n- Извлекаются параметры `page` и `size`.\\n- Валидация обязательности и формата параметров согласно контракту.\\n\\nFR.2. Вызов метода чтения из базы данных\\n- Формируется SQL-запрос с пагинацией на основе полученных параметров.\\n- Запрос выполняется к таблице `orders`.\\n- Логика формирования SQL-запроса включает фильтрацию, сортировку и лимитирование записей:\\n ```sql\\n SELECT * FROM orders ORDER BY id LIMIT :size OFFSET (:page - 1) * :size;\\n ```\\n \\nFR.3. Подсчет общего количества заказов\\n- Выполняется дополнительный SQL-запрос для подсчета всех заказов, соответствующих условиям:\\n ```sql\\n SELECT COUNT(*) FROM orders;\\n ```\\n\\nFR.4. Отображение списка заказов и общее количество\\n- Результат выполнения запросов преобразуется в JSON-формат согласно контракту.\\n- Отправляется HTTP-ответ клиенту с кодом состояния 200 OK, содержащий список заказов и общее количество.\\n\\n### Нефункциональные требования\\n\\n#### Мониторинг\\n\\n| Метрика | Описание | Условие срабатывания |\\n| --------------------------------- | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |\\n| `ORDERS_LIST_PPRB_SUCCESS` | Метрика успешной обработки запроса на стороне PPRB. | Фиксируется при успешном чтении данных из БД и возврате корректного ответа без ошибок. |\\n| `ORDERS_LIST_PPRB_FAIL` | Метрика технической ошибки на стороне PPRB. | Фиксируется при техническом сбое (ошибка БД, таймаут, недоступность инфраструктуры, необработанное исключение, ошибка 5xx). |\\n| `ORDERS_LIST_PPRB_BUSINESS_ERROR` | Метрика бизнес-ошибки доступа на стороне PPRB. | Фиксируется, если проверка ролевой модели завершилась отказом (нет требуемого экшена). |\\n\\n### Контракт\\n\\n## Контракт\\n\\n### Request Parameters\\n\\n| Название | Тип параметра | Тип данных | Обязательность | Описание | Пример |\\n|-------------------|-----------------|--------------|---------------|------------------------------|---------------------------------------|\\n| `X-Request-Id` | `header` | `uuid` | 1 | Сквозной идентификатор запроса | `c7f4d8ce-9d6f-4ef9-a7ba-0d6f5ed8f111` |\\n| `page` | `query` | `integer` | 1 | Номер страницы | `1` |\\n| `size` | `query` | `integer` | 1 | Размер страницы | `20` |\\n\\n### Response Body\\n\\n| Название | Тип данных | Обязательность | Описание | Заполнение | Пример |\\n|----------------------------|------------------|---------------|---------------------------|-----------------------------------|----------------------------------|\\n| `orders` | `array<object>` | 1 | Список заказов | Из выборки БД `orders` | `[{\\\"orderName\\\":\\\"Заказ-001\\\"}]` |\\n| `orders[].orderName` | `string` | 1 | Наименование заказа | `orders.name` | `Заказ-001` |\\n| `orders[].clientDisplayName`| `string` | 1 | Имя клиента | `orders.client_name` | `ООО Ромашка` |\\n| `orders[].orderAmount` | `number` | 1 | Сумма заказа | `orders.amount` | `125000.50` |\\n| `orders[].orderStatus` | `string` | 1 | Статус заказа | `orders.status` | `NEW` |\\n| `totalCount` | `integer` | 1 | Общее количество заказов | `COUNT(*)` по условиям выборки | `245` |\\n\\n### Errors\\n\\nВ разделе не приведены данные о возможных ошибках. Рекомендуется описать стандартные коды ошибок HTTP и соответствующие им сценарии.\\n\\n### Auth\\n\\nАвторизация не описана в источнике. Следует указать способ аутентификации и авторизации для данного API.\\n\\n### Timeout\\n\\nИнформация о тайм-аутах отсутствует. Необходимо указать рекомендуемые значения тайм-аутов для операций.\\n\\n### Retry/Idempotency\\n\\nУсловия повторных запросов и идемпотентность не описаны. Следует добавить информацию, если метод поддерживает такие возможности.\\n\",\n \"reason\": \"Метод PPRB получения списка заказов\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders/ufs/api_method/orders.api.ufs.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.api.ufs.list\\ntitle: Метод UFS получения списка заказов\\ndoc_type: api_method\\nstatus: draft\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.pprb.list\\n - orders.logic.list.mapping\\n - orders.ui.list\\n---\\n\\n# Метод UFS получения списка заказов\\n\\n## Summary\\n\\n- Описывает метод UFS для получения списка заказов.\\n- Использует HTTP-метод GET с маршрутом `/api/v1/orders`.\\n- Включает валидацию обязательных параметров запроса и авторизацию пользователя.\\n- Интегрируется с методом PPRB для получения данных и последующего маппинга в контракт UFS.\\n- Реализована регистрация событий аудита и мониторинг технических и бизнес-метрик.\\n\\n## Details\\n\\n### Технический use case\\n\\n### Технический use case\\n\\n**Название:** Метод UFS получения списка заказов \\n\\n**Предусловия:** \\n- Пользователь прошел аутентификацию в системе.\\n- Запрос содержит корректные параметры пагинации (`page`, `size`) и уникальный идентификатор запроса (`X-Request-Id`).\\n\\n**Триггер:** Получен HTTP-запрос типа GET на endpoint `/api/v1/orders`.\\n\\n**Основной сценарий:**\\n1. Провести валидацию обязательных параметров запроса: `X-Request-Id`, `page`, `size`.\\n2. Авторизовать пользователя по наличию экшена ролевой модели `Role.Orders.List`.\\n3. Вызвать метод PPRB `GET /orders` для получения списка заказов.\\n4. Смаппить ответ PPRB в контракт UFS.\\n5. Вернуть сформированный ответ UI.\\n\\n**Альтернативный сценарий:** \\n- При отсутствии необходимых прав у пользователя завершить сценарий с ошибкой 403 Forbidden.\\n\\n**Обработка ошибок:** \\n- В случае некорректных параметров запроса вернуть ошибку 400 Bad Request.\\n- При ошибке вызова PPRB (таймаут, ошибка сети, недоступность сервиса) зафиксировать метрику `ORDERS_LIST_UFS_FAIL` и вернуть ошибку 500 Internal Server Error.\\n- Если пользователь не имеет необходимого экшена ролевой модели, зафиксировать метрику `ORDERS_LIST_UFS_BUSINESS_ERROR` и вернуть ошибку 403 Forbidden.\\n\\n**Постусловие:** \\n- Результат успешно возвращен пользователю, зафиксирована метрика `ORDERS_LIST_UFS_SUCCESS`.\\n\\n### Функциональные требования\\n\\nFR.1. Интеграция с методом PPRB\\n- **Формирование запроса**: \\n - HTTP-метод: GET\\n - Маршрут: `/orders`\\n - Параметры запроса передаются из входящего запроса UFS: `page`, `size`.\\n - Заголовок `X-Request-Id` передается из входящего запроса.\\n- **Источник данных**: \\n - Данные для запроса берутся из проверенного и валидированного входящего запроса UI.\\n- **Downstream-сервис**: \\n - Сервис PPRB (`GET /orders`)\\n- **Успешный ответ**: \\n - Ответ с кодом состояния HTTP 200, содержащий массив заказов и общее количество записей.\\n- **Бизнес-ошибка**: \\n - Возвращается, если сервис PPRB возвращает ошибку 403 Forbidden (недостаточные права доступа).\\n- **Техническая ошибка**: \\n - Таймауты, ошибки сети, внутренние серверные ошибки (HTTP 5xx), исключения.\\n- **Маппинг ответа**: \\n - Массив заказов (`orders[]`) маппится в поле `items`, где:\\n - `items[].name` соответствует `orders[].orderName`,\\n - `items[].clientName` соответствует `orders[].clientDisplayName`,\\n - `items[].amount` соответствует `orders[].orderAmount`,\\n - `items[].status` соответствует `orders[].orderStatus`.\\n - Пагинационные данные (`page`, `size`, `totalCount`) маппятся в объект `pagination`.\\n\\n### Нефункциональные требования\\n\\n#### Аудит\\n\\n| Код события | Описание события | Логируемые атрибуты |\\n| ----------------------- | -------------------------------------------- | ----------------------------------------------------- |\\n| `ORDERS_LIST_REQUESTED` | Вызов метода получения списка заказов в UFS. | `requestId`, `userId`, `page`, `size`, `responseCode` |\\n\\n#### Мониторинг\\n\\n| Метрика | Описание | Условие срабатывания |\\n| -------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |\\n| `ORDERS_LIST_UFS_SUCCESS` | Метрика успешной обработки запроса на получение списка заказов. | Фиксируется при успешном завершении сценария и возврате корректного ответа без ошибок. |\\n| `ORDERS_LIST_UFS_FAIL` | Метрика технической ошибки при обработке запроса. | Фиксируется при техническом сбое (ошибка сети, таймаут, необработанное исключение, недоступность зависимого сервиса, ошибка 5xx). |\\n| `ORDERS_LIST_UFS_BUSINESS_ERROR` | Метрика бизнес-ошибки доступа. | Фиксируется, если у пользователя отсутствует экшен ролевой модели `Role.Orders.List`. |\\n\\n### Контракт\\n\\n### Контракт\\n\\n#### Request Parameters\\n\\n| Название | Тип параметра | Тип данных | Обязательность | Описание | Пример |\\n|-------------------|-----------------|--------------|---------------|------------------------------|---------------------------------------|\\n| `X-Request-Id` | `header` | `uuid` | 1 | Сквозной идентификатор запроса | `c7f4d8ce-9d6f-4ef9-a7ba-0d6f5ed8f111` |\\n| `page` | `query` | `integer` | 1 | Номер страницы, начиная с 1 | `1` |\\n| `size` | `query` | `integer` | 1 | Размер страницы | `20` |\\n\\n#### Response Body\\n\\n| Название | Тип данных | Обязательность | Описание | Заполнение | Пример |\\n|----------------------|-----------------|---------------|-------------------------|-----------------------------------------|------------------------|\\n| `items` | `array<object>` | 1 | Список заказов | Из `orders[]` ответа PPRB после маппинга | `[{\\\"name\\\":\\\"Заказ-001\\\"}]` |\\n| `items[].name` | `string` | 1 | Наименование заказа | `orders[].orderName` | `Заказ-001` |\\n| `items[].clientName` | `string` | 1 | Наименование клиента | `orders[].clientDisplayName` | `ООО Ромашка` |\\n| `items[].amount` | `number` | 1 | Сумма заказа | `orders[].orderAmount` | `125000.50` |\\n| `items[].status` | `string` | 1 | Статус заказа | `orders[].orderStatus` | `NEW` |\\n| `pagination.page` | `integer` | 1 | Текущая страница | Из query `page` | `1` |\\n| `pagination.size` | `integer` | 1 | Размер страницы | Из query `size` | `20` |\\n| `pagination.total` | `integer` | 1 | Общее количество записей | `totalCount` из ответа PPRB | `245` |\\n\\n#### Errors\\n\\nВозможные ошибки и соответствующие HTTP-коды рекомендуется описать отдельно.\\n\\n#### Auth\\n\\nОписание механизма аутентификации и авторизации следует привести отдельно.\\n\\n#### Timeout\\n\\nРекомендуемые значения тайм-аутов для операций необходимо указать отдельно.\\n\\n#### Retry/Idempotency\\n\\nУточнение поддержки повторных запросов и идемпотентности должно быть добавлено, если эти функции поддерживаются методом.\\n\",\n \"reason\": \"Метод UFS получения списка заказов\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders/ufs/logic_block/orders.logic.list.mapping.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.logic.list.mapping\\ntitle: Маппинг модели PPRB в модель UFS\\ndoc_type: logic_block\\nstatus: draft\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.pprb.list\\n - orders.api.ufs.list\\n - orders.ui.list\\n---\\n\\n# Маппинг модели PPRB в модель UFS\\n\\n## Summary\\n\\n## Summary\\n\\n- Описан логический блок, обеспечивающий маппинг полей модели PPRB в модель UFS.\\n- Ключевые маппинги включают переназначение полей `orderName`, `clientDisplayName`, `orderAmount` и `orderStatus`.\\n- Поля с пустыми строковыми значениями представляются как пустая строка `\\\"\\\"`\\n- Порядок элементов исходного списка сохраняется без изменений.\\n\\n## Details\\n\\n### Технический use case\\n\\n### Технический use case\\n\\n**Название:** Маппинг модели PPRB в модель UFS \\n\\n**Предусловия:** \\n- Получен DTO ответа от PPRB.\\n- Наличие действующего контекста выполнения.\\n\\n**Триггер:** \\nЗапуск процедуры маппинга модели PPRB в модель UFS.\\n\\n**Основной сценарий:** \\n1. Выполнить проверку наличия обязательных полей в полученном DTO.\\n2. Произвести маппинг полей:\\n - `orderName -> name`\\n - `clientDisplayName -> clientName`\\n - `orderAmount -> amount`\\n - `orderStatus -> status`\\n3. Для пустых строковых значений установить пустую строку `\\\"\\\"`\\n4. Сформировать нормализованный объект UFS.\\n5. Вернуть нормализованный объект UFS.\\n\\n**Альтернативный сценарий:** \\n- При отсутствии обязательных полей в DTO остановить выполнение и вернуть ошибку.\\n\\n**Обработка ошибок:** \\n- В случае отсутствия обязательных полей зафиксировать ошибку и возвратить соответствующий код ошибки.\\n- При возникновении исключительных ситуаций (например, проблемы преобразования данных) выполнить логирование и вернуть соответствующую ошибку.\\n\\n**Постусловие:** \\n- Маппинг выполнен успешно, возвращен нормализованный объект UFS.\\n\\n### Функциональные требования\\n\\n- **FR.1. Реализовать маппинг полей:**\\n - `PPRB.orderName -> UFS.name`\\n - `PPRB.clientDisplayName -> UFS.clientName`\\n - `PPRB.orderAmount -> UFS.amount`\\n - `PPRB.orderStatus -> UFS.status`\\n\\n- **FR.2. Обработать пустые строковые значения:**\\n - Все пустые строковые значения должны возвращаться как пустая строка `\\\"\\\"`\\n\\n- **FR.3. Сохранить порядок элементов списка:**\\n - Порядок элементов исходного списка PPRB должен сохраняться в результирующем списке UFS без каких-либо изменений.\\n\\n### Нефункциональные требования\\n\\n### Нефункциональные требования\\n\\n#### Аудит\\n- Аудит не требуется (в рамках переиспользуемого внутреннего блока).\\n\\n#### Мониторинг\\n\\n| Метрика | Описание | Условие срабатывания |\\n|--------------------------------|------------------------------------------------------------------------------------|----------------------------------------------------------------------------|\\n| `MAPPING_EXECUTION_TIME` | Время выполнения маппинга модели PPRB в модель UFS. | Включить технический лог времени выполнения маппинга на уровне debug/trace. |\\n\",\n \"reason\": \"Маппинг модели PPRB в модель UFS\",\n \"hunks\": []\n },\n {\n \"op\": \"create\",\n \"path\": \"docs/orders/web/ui_page/orders.ui.list.md\",\n \"base_hash\": null,\n \"proposed_content\": \"---\\nid: orders.ui.list\\ntitle: Страница списка заказов\\ndoc_type: ui_page\\nstatus: draft\\ndomain: orders\\nsub_domain: list_read\\nrelated_docs:\\n - orders.api.ufs.list\\n - orders.api.pprb.list\\n - orders.logic.list.mapping\\n---\\n\\n# Страница списка заказов\\n\\n## Summary\\n\\n- Описывает страницу веб-интерфейса для отображения списка заказов.\\n- Поддерживает три формы представления: стандартную таблицу заказов, состояние пустого списка и состояние ошибки загрузки.\\n- Таблица заказов отображает поля: наименование, клиент, сумма, статус. Поля доступны только для чтения.\\n- Реализована функциональность пагинации с управлением страницами и повторным запросом данных при изменении страницы.\\n- В состоянии пустого списка отображается иконка пустого лотка и текст \\\"Записи отсутствуют\\\".\\n- В состоянии ошибки отображается иконка ошибки, текст ошибки и кнопка повтора запроса.\\n\\n## Details\\n\\n### Технический use case\\n\\n### Технический use case\\n\\n**Название:** Открытие страницы списка заказов \\n\\n**Предусловия:** \\n- Пользователь вошел в систему и авторизовался.\\n- Интерфейс настроен и готов к работе.\\n\\n**Триггер:** \\nПользователь открывает экран списка заказов.\\n\\n**Основной сценарий:** \\n1. Пользователь инициирует открытие страницы списка заказов.\\n2. UI отправляет первый запрос на получение данных, используя параметры пагинации (`page=1`, `size=20`).\\n3. Система возвращает данные, которые UI отображает в виде таблицы.\\n4. Пользователь выбирает другую страницу в интерфейсе пагинации.\\n5. UI отправляет новый запрос на получение данных с обновленными параметрами пагинации.\\n\\n**Альтернативный сценарий:** \\n- Если список заказов пуст, отображается заглушка с иконкой пустого лотка и сообщением «Записи отсутствуют».\\n- При возникновении ошибки отображается заглушка ошибки с иконкой, текстом ошибки и кнопкой «Повторить», которая позволяет повторить запрос.\\n\\n**Обработка ошибок:** \\n- В случае возникновения ошибки UI показывает заглушку ошибки с возможностью повторного запроса.\\n- Текст ошибки берется из ответа сервера, либо используется стандартное сообщение «Не удалось загрузить список заказов. Попробуйте позже.»\\n\\n**Постусловие:** \\nДанные списка заказов корректно отображаются пользователю в соответствии с выбранной страницей пагинации.\\n\\n### Требования к UI\\n\\n### Требования к UI\\n\\nUI разделен на три основные формы представления:\\n\\n- **Табличное представление**\\n - Поля доступны только для чтения, пользователь не может редактировать значения. Если значение отсутствует, показывается пустая строка.\\n - Колонки таблицы:\\n - `Наименование`: наименование заказа.\\n - `Клиент`: идентификация клиента по заказу.\\n - `Сумма`: выводится в формате денежных значений, принятом на UI.\\n - `Статус`: показывает текущий статус заказа в виде текстового значения.\\n - Элемент пагинации позволяет управлять переключением страниц, инициируя повторный запрос списка при изменении страницы.\\n\\n- **Пустой список (Empty State)**\\n - При отсутствии записей вместо таблицы отображается заглушка с иконкой пустого лотка и текстом: `Записи отсутствуют`.\\n\\n- **Ошибка (Error State)**\\n - При неуспешном ответе отображается заглушка ошибки с иконкой, текстом ошибки (берется из ответа бэкенда или дефолтным текстом `Не удалось загрузить список заказов. Попробуйте позже.`) и кнопкой `Повторить`.\\n - Нажатие кнопки `Повторить` выполняет повторный запрос списка заказов с текущими параметрами пагинации.\\n\\n### Функциональные требования\\n\\nFR.1. Поддержка форм представления\\n- UI поддерживает три формы представления: табличное представление, пустой список, ошибка.\\n\\nFR.2. Отображение атрибутов\\n- UI отображает следующие атрибуты:\\n - `Наименование`\\n - `Клиент`\\n - `Сумма` (выведено в формате денежных значений)\\n - `Статус`\\n \\nFR.3. Поддержка пагинации\\n- UI реализует механизм пагинации:\\n - Позволяет пользователю выбирать номер страницы, который должен быть >= 1.\\n - Размер страницы выбирается из допустимого набора UI.\\n - При изменении страницы инициирует повторный запрос данных.\\n\\nFR.4. Отображение пустого списка\\n- При отсутствии записей вместо таблицы отображается заглушка с иконкой пустого лотка и текстом \\\"Записи отсутствуют\\\".\\n\\nFR.5. Отображение ошибки\\n- При неуспешном ответе отображается заглушка ошибки:\\n - Иконка ошибки.\\n - Текст ошибки (берется из ответа бэкенда; если текст отсутствует, выводится дефолтное сообщение \\\"Не удалось загрузить список заказов. Попробуйте позже.\\\").\\n - Кнопка \\\"Повторить\\\" для повторного запроса списка с текущими параметрами пагинации.\\n\\n### Нефункциональные требования\\n\\n### Нефункциональные требования\\n\\n#### Пользовательская аналитика\\n\\nСобытия пользовательской аналитики оформляются таблицей:\\n\\n| Название события | Описание | Точка вызова | Payload |\\n|----------------------------|-----------------------------------------------------------------|--------------------------------------------------------------------|-------------------------------|\\n| `orders_list_opened` | Фиксирует факт открытия пользователем страницы списка заказов. | После успешной отрисовки экрана списка заказов. | `page`, `size`, `result_count` |\\n| `orders_list_page_changed` | Фиксирует факт перехода пользователя на другую страницу списка. | После выбора пользователем номера страницы и обновления таблицы. | `page`, `size`, `result_count` |\\n\",\n \"reason\": \"Страница списка заказов\",\n \"hunks\": []\n }\n]\n```\n\napply_changeset: true", + "completed_at": "2026-04-14T13:21:20.701581+00:00" +} +``` diff --git a/src/app/core/agent/__init__.py b/src/app/core/agent/__init__.py index 465c646..b3e1458 100644 --- a/src/app/core/agent/__init__.py +++ b/src/app/core/agent/__init__.py @@ -1,3 +1,9 @@ -from app.core.agent.runtime import AgentRuntime - __all__ = ["AgentRuntime"] + + +def __getattr__(name: str): + if name == "AgentRuntime": + from app.core.agent.runtime import AgentRuntime + + return AgentRuntime + raise AttributeError(name) diff --git a/src/app/core/agent/processes/__init__.py b/src/app/core/agent/processes/__init__.py index 510c092..d3ce2f2 100644 --- a/src/app/core/agent/processes/__init__.py +++ b/src/app/core/agent/processes/__init__.py @@ -1,10 +1,22 @@ -from app.core.agent.processes.base import AgentProcess, ProcessResult -from app.core.agent.processes.v1.process import V1Process -from app.core.agent.processes.v2.v2_process import V2Process - __all__ = [ "AgentProcess", "ProcessResult", "V1Process", "V2Process", ] + + +def __getattr__(name: str): + if name in {"AgentProcess", "ProcessResult"}: + from app.core.agent.processes.base import AgentProcess, ProcessResult + + return {"AgentProcess": AgentProcess, "ProcessResult": ProcessResult}[name] + if name == "V1Process": + from app.core.agent.processes.v1.process import V1Process + + return V1Process + if name == "V2Process": + from app.core.agent.processes.v2.v2_process import V2Process + + return V2Process + raise AttributeError(name) diff --git a/src/app/core/agent/processes/v2/__init__.py b/src/app/core/agent/processes/v2/__init__.py index b2633c3..921e4e5 100644 --- a/src/app/core/agent/processes/v2/__init__.py +++ b/src/app/core/agent/processes/v2/__init__.py @@ -1,9 +1,11 @@ -from app.core.agent.processes.v2.intent_router.router import V2IntentRouter - __all__ = ["V2IntentRouter", "V2Process"] def __getattr__(name: str): + if name == "V2IntentRouter": + from app.core.agent.processes.v2.intent_router.router import V2IntentRouter + + return V2IntentRouter if name == "V2Process": from app.core.agent.processes.v2.v2_process import V2Process diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/README.md b/src/app/core/agent/processes/v2/doc_rules_v2/README.md deleted file mode 100644 index 1a3ed4b..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Documentation Rules V2 - -Этот каталог — новая структура правил для DOC_UPDATE/FROM_FEATURE. - -## Цель - -Разделить инструкции на 2 независимых блока: - -1. `types/` — инструкции по структуре конкретных типов документов (`ui_page`, `api_method`, и т.д.). -2. `common-elements/` — инструкции по структуре общих элементов страницы (`tech-use-case`, `fr`, и др.). - -## Структура каталога - -- `documentation-rules.md` — верхнеуровневые правила. -- `global/` — общие правила оформления и frontmatter. -- `types/` — правила по типам документов (вместо `artifact-types/`). -- `common-elements/` — правила по общим секциям (вместо `sections/`). -- `templates/` — шаблоны документов. - -## Переключение профиля - -Загрузчик поддерживает переключение через env: - -- `DOC_RULES_PROFILE=v2` (по умолчанию) — использовать `doc_rules_v2`. -- `DOC_RULES_PROFILE=legacy` — использовать старый каталог `doc_rules`. - -Если `v2` не содержит валидных пар `type + template`, загрузчик автоматически fallback на `doc_rules`. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/api-contract.md b/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/api-contract.md deleted file mode 100644 index fc313ea..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/api-contract.md +++ /dev/null @@ -1,24 +0,0 @@ -# API Contract Rules - -## Назначение - -Этот файл описывает, как оформлять подраздел `## Контракт` в API-документах. - -## Что должно быть описано - -- входные параметры -- выходные параметры -- JSON-структуры запросов и ответов -- обязательность полей -- типы полей -- ограничения -- описание назначения полей -- примеры данных -- auth -- idempotency -- timeout -- ошибки и их HTTP-коды - -## Правило качества - -Контракт должен быть достаточно формальным, чтобы по нему можно было собрать OpenAPI-спецификацию. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/details.md b/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/details.md deleted file mode 100644 index 33ed824..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/details.md +++ /dev/null @@ -1,13 +0,0 @@ -# Details Section Rules - -## Назначение - -Этот файл задает общие правила для секции `## Details`. - -## Правила - -- `Details` оформляется как `## Details`. -- Внутри `Details` используются заголовки уровня `###` и ниже. -- Структура Details зависит от типа документа. -- В Details не нужно повторно дублировать навигацию и связи, если они уже есть во frontmatter. -- Интеграции, ошибки и кодовые привязки должны быть выделены в отдельные подразделы, если они существенны для понимания документа. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/fr.md b/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/fr.md deleted file mode 100644 index f212330..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/fr.md +++ /dev/null @@ -1,37 +0,0 @@ -# Functional requrements rules - -## Назначение - -Этот файл описывает, как оформлять функциональные требования в подраздел `### Функциональные требования` в документах. - -## Правила -- Функциональное требование (FR) расширяет и дополняет шаги, описанные в сценарии. -- Функциональное требование (FR) не должно копировать шаг сценария не неся дополнительной информации. -- Название функционального требования формируется следующим образом - "FR.<номер>. <Название>", где - - <номер> идет инкрементально внутри конкретного документа, начинается с 1. - - <Название> - кратко описывает что делает требование, суть действий (от 3 до 7 слов) - - - -## Пример целевого описания сценария - -### Примеры названия FR - - Получение данных клиента из АС ЕПК - - Проверка уровня доступа - - Сценарий построения списка связанных предложений - - - ### Примеры описания FR -FR.1. Получение данных клиента из АС ЕПК -1. Сформировать запрос к эндпоинту POST /api/v1/path/to/resourse в АС ЕПК - - Заголовки - - <тут идет описание заголовков и того как они формируются> - - Параметры запроса - - <тут идет описание параметров и того как они формируются> - - Тело запроса - - <тут идет описание структуры объекта JSON или payload в другмо формате так как это задано требованиями> - -2. Обработать ответ от АС ЕПК - Успешный ответ - <взять из описания вызываеого api критерии успешного ответа > - Ничего не найдено - <взять из описания вызываеого api критерии успешного овтета, опционально (если применимо)> - Ошибка - <взять из описания вызываеого api критерии успешного ответа > \ No newline at end of file diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/requirements-format.md b/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/requirements-format.md deleted file mode 100644 index 14eb0c3..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/requirements-format.md +++ /dev/null @@ -1,16 +0,0 @@ -# Requirements Format Rules - -## Назначение - -Этот файл задает формат для функциональных и нефункциональных требований. - -## Функциональные требования - -- Использовать коды `FR-1`, `FR-2`, `FR-3` и так далее. -- Каждое требование должно описывать отдельный обязательный аспект поведения. -- Идентификаторы локальны в пределах одного документа. - -## Нефункциональные требования - -- Использовать коды `NFR-1`, `NFR-2`, `NFR-3` и так далее. -- Требования должны описывать характеристики качества, ограничения и эксплуатационные свойства. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/summary.md b/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/summary.md deleted file mode 100644 index 7f7fa7b..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/summary.md +++ /dev/null @@ -1,13 +0,0 @@ -# Summary Section Rules - -## Назначение - -Этот файл задает правила для секции `## Summary`. - -## Правила - -- Summary должен быть коротким explain-слоем быстрого контекста. -- Summary должен объяснять суть документа без лишних деталей. -- Summary должен быть пригоден для explain и быстрого чтения. -- Предпочтительный формат: список ключевых фактов `Purpose`, `Actor`, `Trigger`, `Errors`, `Related ...` и т.д. -- Для крупных документов допустим более длинный summary, если он остается структурированным. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/tech-use-case.md b/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/tech-use-case.md deleted file mode 100644 index 572d52f..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/common-elements/tech-use-case.md +++ /dev/null @@ -1,66 +0,0 @@ -# Scenario Rules - -## Назначение - -Этот файл описывает, как оформлять технический USE CASE в подраздел `### Сценарий` в документах. - -## Обязательные части - -- название -- предусловия -- триггер -- основной сценарий -- альтернативный сценарий -- обработка ошибок -- постусловие - -## Правила -- Основной и альтернативные сценарии состоят из шагов. - -- Каждый шаг описывается одним предложением не более 15-20 слов, и состоит из двух частей. Первая часть описывает что мы делаем по смыслу, чтобы это было понятно человеку без низкоуровневых технических деталей. Например: авторизует запрос, получает данные клиента, запрашивает справочники. Вторая часть описывает как это реализовано технически - вызывает эндпоинт /path/to/resource в системе <название системы>. - -- В описании шага не должно быть длинных технических деталей. Если техничсекую реализацию нельхзя описатьодним предложенеим (в лимите длины описания шага), то необхлодимо это вынести в отдельное функциональное требование FR.<номер>. <Название> и описать в нем технические детали. А в шаге сослаться на это требование через "Описание приведено в FR.<номер>. <Название>" - -- Для шагов авторизации обязателен доп шаг с описанием обработки ошибки. -- Для шагов с интеграцией обязателен доп шаг с описанием обработки ошибки. -- Для шагов с проверкой условий обязательны доп шаги с описанием переходов по сценарию. - -- Название "FR.<номер>. <Название>" формируется следующим образом: - - <номер> идет инкрементально внутри конкретного документа, начинается с 1. - - <Название> - кратко описывает что делает требование, суть действий. - -- Для каждого шага при необходимости нужно прописать логику действий в случае ошибки или если логика шага определяет несколько сценариев разивития при выполнении заданных условий. - -- Для шагов, которые описывают интеграцию с другой системой необходимо указать название точки интеграции (название эндпоинта, название топика и так далее) и сделать ссылку на FR.<номер>. <Название> с описанием шагов интеграции - как сформировать запрос/сообщение, как обработать ответ, политику ретраев. - - - Сценарий собирается из тезисов, приведенных системной аналимтике в свободной формулировке - - - Функциональные требования "FR.<номер>. <Название>" не должны дублировать шагов сценария в use case. Они содержат детали, которые вынесены из юзкейса чтобы не делать его тяжелым. Если шаг юзкейса описывается одним предложением в лимите длины, то FR делать не нужно. - - - FR обязательно описывается для шага с интеграцией - - FR Не описывается для шага авторизации. - - - - - - -## Пример целевого описания сценария - -### Примеры шагов сценария - -Пример 1 -- Авторизует запрос пользователя по наличию у него экшена ролевой модели CI02792632.ContactsDGR.Detail - - В случае ошибки - завершить сценарий с кодом UNAUTHORIZED - -Пример 2 -- Запрашивает данные клиента - вызывает /api/v1/clients/{client-id}/info - - В случае ошибки - завершить сценарий с кодом CLIENT_INFO_REQUEST_FAIL - -Пример 3 -- Возвращает ответ в формате <название DTO> - -### Примеры названия FR - - Получение данных клиента из АС ЕПК - - Проверка уровня доступа - - Сценарий построения списка связанных предложений \ No newline at end of file diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/documentation-rules.md b/src/app/core/agent/processes/v2/doc_rules_v2/documentation-rules.md deleted file mode 100644 index 1be0884..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/documentation-rules.md +++ /dev/null @@ -1,71 +0,0 @@ -# Documentation Rules - -Этот каталог оформляет MVP документации проекта в атомарном формате. - -## Базовая структура - -- Каждый документ содержит YAML frontmatter. -- В документе должен быть один `H1`, совпадающий с `title`. -- Основные разделы оформляются как `## Summary` и `## Details`. -- Внутри `Details` используются заголовки уровня `###` и ниже. -- Связи, сущности и навигация описываются во frontmatter через `related_docs`, `links`, `entities`, `parent`, `children`. - -## Summary - -- Краткий explain-слой быстрого контекста. -- Должен позволять быстро понять назначение документа без чтения `Details`. -- Предпочтительный формат: компактный список ключевых фактов без длинных абзацев. - -## Details - -- Раскрывает полное описание объекта. -- Структура `Details` зависит от типа документа. -- Сценарии, ограничения, интеграции, ошибки и кодовые привязки должны быть разнесены по отдельным подразделам. - -## API documents - -Для `api_method` внутри `## Details` обязательны разделы: -- `### Описание` -- `### Сценарий` -- `### Функциональные требования` -- `### Нефункциональные требования` -- `### Контракт` - -Если у метода есть интеграции и ошибки, также обязательны: -- `### Интеграции` -- `### Ошибки` -- `### Связанный код` -- `### История изменений` - -### Сценарий - -Сценарий оформляется как технический use case и содержит: -- название -- предусловия -- триггер -- основной сценарий -- альтернативный сценарий -- обработку ошибок -- постусловие - -### Требования - -- Функциональные требования маркируются как `FR-1`, `FR-2`, ... -- Нефункциональные требования маркируются как `NFR-1`, `NFR-2`, ... -- Идентификаторы требований локальны в рамках одного документа. - -### Контракт - -Контракт должен быть пригоден для последующей сборки OpenAPI-спецификации и включать: -- входные параметры -- выходные параметры -- структуру JSON-сообщений -- обязательность полей -- типы и ограничения -- описание полей -- правила заполнения -- примеры данных -- auth -- idempotency -- timeout -- ошибки и их HTTP-коды diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/global/documentation-system.md b/src/app/core/agent/processes/v2/doc_rules_v2/global/documentation-system.md deleted file mode 100644 index 656b569..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/global/documentation-system.md +++ /dev/null @@ -1,38 +0,0 @@ -# Documentation System - -## Назначение - -Этот файл задает общую модель документации проекта. - -## Базовая модель - -Каждый документ должен состоять из двух слоев: -- YAML frontmatter -- контент - -Контент всегда состоит из двух обязательных разделов: -- `## Summary` -- `## Details` - -Над ними должен быть один заголовок `# <title>`, совпадающий со значением `title` во frontmatter. - -## Принципы - -- Документы должны быть атомарными. -- Один документ описывает одну тему. -- Вместо дублирования между документами используются явные ссылки. -- Связи и навигация должны быть формализованы. -- Документы должны быть пригодны для чтения человеком и для RAG. -- Документы должны быть пригодны для частичного обновления без деградации структуры. - -## Типы документов - -На уровне проекта поддерживаются типы: -- `api_method` -- `logic_block` -- `architecture_overview` -- `domain_entity` -- `ui_page` -- `integration_doc` -- `index_page` -- `glossary_item` diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/global/frontmatter.md b/src/app/core/agent/processes/v2/doc_rules_v2/global/frontmatter.md deleted file mode 100644 index 2b4dee5..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/global/frontmatter.md +++ /dev/null @@ -1,67 +0,0 @@ -# Frontmatter Rules - -## Назначение - -Этот файл описывает единый контракт YAML frontmatter для всех документов. - -## Обязательные поля - -```yaml -id: string -title: string -doc_type: string -domain: string -sub_domain: string -related_docs: [] -status: string -``` - -## Поля совместимости и рекомендуемые поля - -```yaml -type: string -name: string -module: string -layer: string -updated_at: YYYY-MM-DD -tags: [] -entities: [] -parent: string | null -children: [] -links: {} -source_of_truth: string -related_code: [] -system_analytics_refs: [] -``` - -## Правила - -- `id` должен быть стабильным и уникальным в пределах документации проекта. -- `title` — человекочитаемый заголовок. -- `doc_type` — канонический тип документа. -- `domain` и `sub_domain` определяют бизнес-контекст документа. -- `related_docs` хранит явные связи с другими markdown-документами. -- `status` хранит жизненный цикл документа: например `draft`, `approved`, `active`. -- `type` допустимо дублировать как alias для tooling-совместимости с индексаторами. -- `name` — короткое системное имя документа. -- `module` — модуль или подсистема. -- `layer` — слой системы. -- `updated_at` хранится в формате `YYYY-MM-DD`. - -## Связи и навигация - -- `entities` описывает сущности, связанные с документом. -- `parent` и `children` описывают иерархию. -- `links` описывает typed graph связей между документами, кодом и интеграциями. - -## Формат links - -```yaml -links: - called_by: - - ext.health_probe - uses_logic: - - logic.some_flow - integrates_with: - - ext.some_system -``` diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/global/linking.md b/src/app/core/agent/processes/v2/doc_rules_v2/global/linking.md deleted file mode 100644 index 6e49171..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/global/linking.md +++ /dev/null @@ -1,33 +0,0 @@ -# Linking Rules - -## Назначение - -Этот файл описывает, как связывать документы между собой. - -## Иерархия - -- `parent` используется для родительского документа. -- `children` используется для прямых дочерних документов. -- Иерархия должна быть осмысленной и стабильной. -- Для общей точки входа допустим `index_page`. - -## Графовые связи - -Для `related_docs` используются ссылки на соседние документы. - -Для `links` рекомендуется использовать typed-ключи: -- `called_by` -- `uses_logic` -- `reads_db` -- `writes_db` -- `integrates_with` -- `used_by` -- `exposes_api` -- `uses_entities` - -## Правила использования - -- Если документ логически входит в другой, использовать `parent`/`children`. -- Если связь нужна для навигации между равноправными документами, дублировать ее в `related_docs`. -- Если связь отражает поведение, интеграции или переиспользование, фиксировать ее в `links`. -- Детальное описание интеграций хранить в body документа, а не только во frontmatter. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/global/naming.md b/src/app/core/agent/processes/v2/doc_rules_v2/global/naming.md deleted file mode 100644 index c722416..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/global/naming.md +++ /dev/null @@ -1,24 +0,0 @@ -# Naming Rules - -## Назначение - -Этот файл описывает правила именования документов, файлов и идентификаторов. - -## Правила для файлов - -- Имена файлов должны быть в kebab-case. -- Имя файла должно отражать одну тему. -- Для шаблонов использовать суффикс `.template.md`. - -## Правила для id - -- `id` строится в формате `<type-group>.<name>`. -- Примеры: - - `api.send_message_endpoint` - - `logic.telegram_notification_loop` - - `architecture.telegram_notify_app` - -## Правила для title - -- `title` должен быть кратким и человекочитаемым. -- В `title` допускаются пробелы и естественный язык. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/global/writing-style.md b/src/app/core/agent/processes/v2/doc_rules_v2/global/writing-style.md deleted file mode 100644 index 6c1caec..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/global/writing-style.md +++ /dev/null @@ -1,19 +0,0 @@ -# Writing Style - -## Назначение - -Этот файл задает правила стиля для текстового наполнения документации. - -## Правила стиля - -- Текст должен быть лаконичным. -- Формулировки должны быть точными и техническими. -- Summary должен быть кратким explain-слоем. -- Details должен раскрывать суть без лишней воды. -- Нежелательно смешивать несколько тем в одном документе. -- Если детали относятся к другому артефакту, их нужно выносить в отдельный документ. - -## Язык - -- Основной язык документации — русский. -- Технические термины, названия классов, API, RAG, OpenAPI, runtime и другие устоявшиеся identifiers можно оставлять на английском. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/templates/api_method.template.md b/src/app/core/agent/processes/v2/doc_rules_v2/templates/api_method.template.md deleted file mode 100644 index ba2ac07..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/templates/api_method.template.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -id: api.example_method -type: api_method -doc_type: api_method -name: example_method -title: HTTP API /example -module: example_module -layer: application -domain: example_domain -sub_domain: example_subdomain -related_docs: [] -status: draft -updated_at: 2026-03-20 -source_of_truth: code -parent: null -children: [] -tags: [] -entities: [] -links: {} ---- - -# HTTP API /example - -## Summary - -Краткое описание метода. - -## Details - -## Описание - -Короткое описание сути метода. - -## Сценарий - -**Название:** - -**Предусловия:** -- - -**Триггер:** -- - -**Основной сценарий:** -1. - -**Альтернативный сценарий:** -1. - -**Обработка ошибок:** -1. - -**Постусловие:** -- - -## Функциональные требования - -**FR-1.** - -## Нефункциональные требования - -**NFR-1.** - -## Контракт - -### Входные параметры - -| Параметр | Где передается | Тип | Обязательность | Ограничения | Описание | Пример | -|---|---|---|---|---|---|---| -| | | | | | | | - -### Выходные параметры - -| Поле | Тип | Обязательность | Ограничения | Описание | Заполнение | Пример | -|---|---|---|---|---|---|---| -| | | | | | | | - -### Интеграции - -### Ошибки - -### Связанный код - -### История изменений diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/templates/architecture_overview.template.md b/src/app/core/agent/processes/v2/doc_rules_v2/templates/architecture_overview.template.md deleted file mode 100644 index 21c7319..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/templates/architecture_overview.template.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -id: architecture.example_system -type: architecture_overview -doc_type: architecture_overview -name: example_system -title: Обзор архитектуры Example System -module: example_module -layer: system -domain: example_domain -sub_domain: example_subdomain -related_docs: [] -status: draft -updated_at: 2026-03-20 -source_of_truth: mixed -parent: null -children: [] -tags: [] -entities: [] -links: {} ---- - -# Обзор архитектуры Example System - -## Summary - -Краткое описание архитектуры. - -## Details - -### Описание - -### Контекст - -### Границы системы - -### Компоненты - -### Интеграционные сценарии - -### Интеграции - -### Ограничения - -### Связанный код - -### Связанные документы - -### История изменений diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/templates/domain_entity.template.md b/src/app/core/agent/processes/v2/doc_rules_v2/templates/domain_entity.template.md deleted file mode 100644 index f8fd65e..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/templates/domain_entity.template.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -id: domain.example_entity -type: domain_entity -doc_type: domain_entity -name: example_entity -title: Пример доменной сущности -module: example_module -layer: domain -domain: example_domain -sub_domain: example_subdomain -related_docs: [] -status: draft -updated_at: 2026-03-20 -source_of_truth: code -parent: null -children: [] -tags: [] -entities: [] -links: {} ---- - -# Пример доменной сущности - -## Summary - -Краткое описание сущности. - -## Details - -### Описание - -### Модель данных - -### Состояния и инварианты - -### Технический use case - -### Функциональные требования - -### Нефункциональные требования - -### Интеграции - -### Связанный код - -### Связанные документы - -### История изменений diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/templates/logic_block.template.md b/src/app/core/agent/processes/v2/doc_rules_v2/templates/logic_block.template.md deleted file mode 100644 index 36e1d5d..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/templates/logic_block.template.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -id: logic.example_block -type: logic_block -doc_type: logic_block -name: example_block -title: Пример блока логики -module: example_module -layer: application -domain: example_domain -sub_domain: example_subdomain -related_docs: [] -status: draft -updated_at: 2026-03-20 -source_of_truth: code -parent: null -children: [] -tags: [] -entities: [] -links: {} ---- - -# Пример блока логики - -## Summary - -Краткое описание блока логики. - -## Details - -### Описание - -### Контекст - -### Технический use case - -### Функциональные требования - -### Нефункциональные требования - -### Интеграции - -### Ограничения и условия вызова - -### Ошибки и деградации - -### Связанные API - -### Связанный код - -### История изменений diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/templates/ui_page.template.md b/src/app/core/agent/processes/v2/doc_rules_v2/templates/ui_page.template.md deleted file mode 100644 index 5bd32fe..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/templates/ui_page.template.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -id: ui.example_page -type: ui_page -doc_type: ui_page -name: example_page -title: Пример UI-страницы -module: example_module -layer: presentation -domain: example_domain -sub_domain: example_subdomain -related_docs: [] -status: draft -updated_at: 2026-03-20 -source_of_truth: mixed -parent: null -children: [] -tags: [] -entities: [] -links: {} ---- - -# Пример UI-страницы - -## Summary - -Краткое описание страницы и её назначения. - -## Details - -### Назначение страницы - -### Пользовательский сценарий - -### Основные блоки интерфейса - -### Связанные API и сущности - -### Функциональные требования - -### Нефункциональные требования - -### Ограничения и граничные случаи - -### Ошибки и валидации - -### Связанный код - -### Связанные документы - -### История изменений diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/types/api_method.md b/src/app/core/agent/processes/v2/doc_rules_v2/types/api_method.md deleted file mode 100644 index bfc6428..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/types/api_method.md +++ /dev/null @@ -1,39 +0,0 @@ -# API Method Rules - -## Назначение - -Этот файл задает правила для документов типа `api_method`. - -## Когда использовать - -Использовать для описания одного HTTP endpoint или одного отдельного API метода. - -## Обязательная структура - -Документ должен содержать: -- YAML frontmatter -- `# <title>` -- `## Summary` -- `## Details` - -Внутри `## Details` обязательны: -- `### Описание` -- `### Сценарий` -- `### Функциональные требования` -- `### Нефункциональные требования` -- `### Контракт` - -## Особые правила - -- Сценарий оформляется как технический use case. -- Функциональные требования маркируются `FR-*`. -- Нефункциональные требования маркируются `NFR-*`. -- Контракт должен быть пригоден для последующей сборки OpenAPI. -- Если у метода есть интеграции, они выносятся в `### Интеграции`. -- Ошибки и HTTP-коды либо описываются в `### Ошибки`, либо ссылаются на централизованный каталог ошибок. - -## Ошибки оформления - -- Нельзя заменять контракт общим текстовым описанием. -- Нельзя смешивать несколько endpoint в одном документе. -- Нельзя хранить связи и навигацию вне frontmatter. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/types/architecture_overview.md b/src/app/core/agent/processes/v2/doc_rules_v2/types/architecture_overview.md deleted file mode 100644 index e4b146e..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/types/architecture_overview.md +++ /dev/null @@ -1,31 +0,0 @@ -# Architecture Overview Rules - -## Назначение - -Этот файл задает правила для документов типа `architecture_overview`. - -## Когда использовать - -Использовать как входной документ для понимания системы, модуля или сервиса. - -## Обязательная структура - -Документ должен содержать: -- YAML frontmatter -- `# <title>` -- `## Summary` -- `## Details` - -## Что описывать в Details - -- границы системы -- основные компоненты -- ключевые взаимодействия -- интеграционные сценарии -- главные ограничения -- ссылки на дочерние документы по API, logic, domain и другим артефактам - -## Ошибки оформления - -- Нельзя дублировать в архитектурном обзоре полные API-контракты. -- Нельзя делать архитектурный обзор единственным документом на всю систему без декомпозиции. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/types/domain_entity.md b/src/app/core/agent/processes/v2/doc_rules_v2/types/domain_entity.md deleted file mode 100644 index c533266..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/types/domain_entity.md +++ /dev/null @@ -1,30 +0,0 @@ -# Domain Entity Rules - -## Назначение - -Этот файл задает правила для документов типа `domain_entity`. - -## Когда использовать - -Использовать для описания одной доменной сущности, ее смысла, состояния и роли в системе. - -## Обязательная структура - -Документ должен содержать: -- YAML frontmatter -- `# <title>` -- `## Summary` -- `## Details` - -## Что описывать в Details - -- смысл сущности -- ключевые атрибуты -- состояния или инварианты -- использование сущности в системе -- интеграции с API, workflow или внешними потребителями, если они важны для понимания модели - -## Ошибки оформления - -- Нельзя смешивать несколько независимых сущностей в одном документе. -- Нельзя подменять доменную сущность описанием endpoint или workflow. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/types/integration_doc.md b/src/app/core/agent/processes/v2/doc_rules_v2/types/integration_doc.md deleted file mode 100644 index 7f1fe35..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/types/integration_doc.md +++ /dev/null @@ -1,25 +0,0 @@ -# Integration Doc Rules - -## Назначение - -Этот файл задает правила для документов типа `integration_doc`. - -## Когда использовать - -Использовать для описания интеграции между системами, сервисами или внешними провайдерами. - -## Обязательная структура - -Документ должен содержать: -- YAML frontmatter -- `# <title>` -- `## Summary` -- `## Details` - -## Что описывать в Details - -- цель интеграции -- участвующие стороны -- направление обмена -- ключевой сценарий взаимодействия -- ограничения и риски diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/types/logic_block.md b/src/app/core/agent/processes/v2/doc_rules_v2/types/logic_block.md deleted file mode 100644 index 788e4f7..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/types/logic_block.md +++ /dev/null @@ -1,31 +0,0 @@ -# Logic Block Rules - -## Назначение - -Этот файл задает правила для документов типа `logic_block`. - -## Когда использовать - -Использовать для описания одного законченного блока логики, workflow или процесса. - -## Обязательная структура - -Документ должен содержать: -- YAML frontmatter -- `# <title>` -- `## Summary` -- `## Details` - -## Что описывать в Details - -- назначение логического блока -- входы и выходы -- последовательность выполнения -- интеграции -- ключевые ограничения -- состояние и ошибки, если они важны для понимания блока - -## Ошибки оформления - -- Нельзя описывать весь модуль целиком, если логика распадается на несколько независимых блоков. -- Нельзя превращать документ в пересказ исходного кода построчно. diff --git a/src/app/core/agent/processes/v2/doc_rules_v2/types/ui_page.md b/src/app/core/agent/processes/v2/doc_rules_v2/types/ui_page.md deleted file mode 100644 index 9640671..0000000 --- a/src/app/core/agent/processes/v2/doc_rules_v2/types/ui_page.md +++ /dev/null @@ -1,24 +0,0 @@ -# UI Page Rules - -## Назначение - -Этот файл задает правила для документов типа `ui_page`. - -## Когда использовать - -Использовать для описания одной пользовательской страницы, экрана или отдельного UI-сценария. - -## Обязательная структура - -Документ должен содержать: -- YAML frontmatter -- `# <title>` -- `## Summary` -- `## Details` - -## Что описывать в Details - -- назначение страницы -- пользовательский сценарий -- основные блоки интерфейса -- связанные API и сущности diff --git a/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/README.md b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/README.md new file mode 100644 index 0000000..4c291e7 --- /dev/null +++ b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/README.md @@ -0,0 +1,9 @@ +# DOC_UPDATE/FROM_FEATURE v2 Rules + +Этот каталог содержит общие rules для всех шагов и подпроцессов workflow `doc_update_from_feature_v2`. + +- `attribute_resolution.md` — правила определения type/id/application/platform. +- `path_resolution.md` — правила резолва путей документации. +- `section_frontmatter.md` — инструкции для frontmatter. +- `section_summary.md` — инструкции для summary. +- `section_details.md` — инструкции для details. diff --git a/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/attribute_resolution.md b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/attribute_resolution.md new file mode 100644 index 0000000..e9fe656 --- /dev/null +++ b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/attribute_resolution.md @@ -0,0 +1,5 @@ +# Attribute Resolution + +1. Приоритет: теги из requirement > metadata документа > LLM fallback. +2. Обязательные атрибуты: `type`, `id`, `application`, `platform`. +3. Если атрибут отсутствует, разрешен fallback через LLM. diff --git a/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/path_resolution.md b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/path_resolution.md new file mode 100644 index 0000000..827021c --- /dev/null +++ b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/path_resolution.md @@ -0,0 +1,7 @@ +# Path Resolution + +Путь строится как: + +`docs/<application>/<platform>/<type>/<id>.md` + +Нормализация сегментов: lowercase + замена недопустимых символов на `-`. diff --git a/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_details.md b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_details.md new file mode 100644 index 0000000..4a87491 --- /dev/null +++ b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_details.md @@ -0,0 +1,3 @@ +# Details Rules + +Details содержит детализированное описание поведения, ограничений и сценариев. diff --git a/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_frontmatter.md b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_frontmatter.md new file mode 100644 index 0000000..a2d1a35 --- /dev/null +++ b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_frontmatter.md @@ -0,0 +1,4 @@ +# Frontmatter Rules + +1. Frontmatter всегда в блоке `---`. +2. Должны быть поля id/title/type/application/platform. diff --git a/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_summary.md b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_summary.md new file mode 100644 index 0000000..7c5e57d --- /dev/null +++ b/src/app/core/agent/processes/v2/rules_doc_update_from_feature_v2/section_summary.md @@ -0,0 +1,3 @@ +# Summary Rules + +Summary содержит краткую цель страницы и основные изменения. diff --git a/src/app/core/agent/processes/v2/v2_process.py b/src/app/core/agent/processes/v2/v2_process.py index ddf6ef3..3b2f53f 100644 --- a/src/app/core/agent/processes/v2/v2_process.py +++ b/src/app/core/agent/processes/v2/v2_process.py @@ -18,6 +18,10 @@ from app.core.agent.processes.v2.workflows.doc_update_from_feature.graph import from app.core.agent.processes.v2.workflows.doc_update_from_feature.workflow_runtime.context import ( DocUpdateFromFeatureContext, ) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.graph import DocUpdateFromFeatureV2Graph +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) from app.core.agent.processes.v2.workflows.general_qa_summary.workflow_runtime.context import GeneralQaSummaryContext from app.core.agent.processes.v2.workflows.general_qa_summary.graph import GeneralQaSummaryGraph from app.core.agent.utils.llm import AgentLlmService @@ -44,6 +48,7 @@ class V2Process(AgentProcess): general_summary_prompt_name: str = "v2_general.summary_answer", workflow_llm_enabled: bool = True, doc_rules_enabled: bool = True, + doc_update_workflow_version: str = "v2", ) -> None: self._router = router or V2IntentRouter() gate = evidence_gate or DocsEvidenceGate() @@ -51,6 +56,8 @@ class V2Process(AgentProcess): self._general_summary_prompt_name = general_summary_prompt_name self._workflow_llm_enabled = workflow_llm_enabled self._doc_rules_enabled = doc_rules_enabled + self._doc_update_workflow_version = doc_update_workflow_version.strip().lower() or "v2" + doc_update_graph = self._build_doc_update_workflow(llm, doc_rules_enabled) self._workflows: dict[tuple[str, str, str], Any] = { (V2Domain.DOCS, V2Intent.DOC_EXPLAIN, V2Subintent.SUMMARY): DocExplainSummaryGraph( llm, @@ -69,10 +76,7 @@ class V2Process(AgentProcess): policy_resolver=policy_resolver, rag_adapter=rag_adapter, ), - (V2Domain.DOCS, V2Intent.DOC_UPDATE, V2Subintent.FROM_FEATURE): DocUpdateFromFeatureGraph( - llm=llm, - doc_rules_enabled=doc_rules_enabled, - ), + (V2Domain.DOCS, V2Intent.DOC_UPDATE, V2Subintent.FROM_FEATURE): doc_update_graph, (V2Domain.GENERAL, V2Intent.GENERAL_QA, V2Subintent.SUMMARY): GeneralQaSummaryGraph( llm, policy_resolver=policy_resolver, @@ -175,12 +179,20 @@ class V2Process(AgentProcess): ) ) if route.intent == V2Intent.DOC_UPDATE and route.subintent == V2Subintent.FROM_FEATURE: + if self._doc_update_workflow_version == "legacy": + return await workflow.run( + DocUpdateFromFeatureContext( + runtime=runtime_context, + route=route, + rag_session_id=rag_session_id, + doc_rules_enabled=self._doc_rules_enabled, + ) + ) return await workflow.run( - DocUpdateFromFeatureContext( + DocUpdateFromFeatureV2Context( runtime=runtime_context, route=route, rag_session_id=rag_session_id, - doc_rules_enabled=self._doc_rules_enabled, ) ) return await workflow.run( @@ -192,3 +204,8 @@ class V2Process(AgentProcess): workflow_llm_enabled=self._workflow_llm_enabled, ) ) + + def _build_doc_update_workflow(self, llm: AgentLlmService, doc_rules_enabled: bool): + if self._doc_update_workflow_version == "legacy": + return DocUpdateFromFeatureGraph(llm=llm, doc_rules_enabled=doc_rules_enabled) + return DocUpdateFromFeatureV2Graph(llm=llm) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/__init__.py new file mode 100644 index 0000000..eddbc35 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/__init__.py @@ -0,0 +1,11 @@ +"""DOC_UPDATE/FROM_FEATURE v2 workflow package.""" + +__all__ = ["DocUpdateFromFeatureV2Graph"] + + +def __getattr__(name: str): + if name == "DocUpdateFromFeatureV2Graph": + from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.graph import DocUpdateFromFeatureV2Graph + + return DocUpdateFromFeatureV2Graph + raise AttributeError(name) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/graph.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/graph.py new file mode 100644 index 0000000..8b47895 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/graph.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step1_resolve_source.step import ( + ResolveSourceStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step2_load_source_content.step import ( + LoadSourceContentStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step3_parse_requirements.step import ( + ParseRequirementsStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step4_prepare_tasks.step import ( + PrepareRequirementTasksStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step4_load_rules.step import LoadRulesStep +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step5_execute_subprocesses.step import ( + ExecuteRequirementSubprocessesStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step6_finalize.step import FinalizeAnswerStep +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.buffered_graph import ( + DocUpdateFromFeatureV2WorkflowGraph, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) +from app.core.agent.utils.llm import AgentLlmService + + +class DocUpdateFromFeatureV2Graph(DocUpdateFromFeatureV2WorkflowGraph[DocUpdateFromFeatureV2Context]): + def __init__(self, llm: AgentLlmService) -> None: + super().__init__( + workflow_id="v2.docs_update.from_feature_v2", + source="workflow.v2.docs_update.from_feature_v2", + steps=[ + ResolveSourceStep(), + LoadSourceContentStep(), + ParseRequirementsStep(), + PrepareRequirementTasksStep(llm=llm), + LoadRulesStep(), + ExecuteRequirementSubprocessesStep(llm=llm), + FinalizeAnswerStep(), + ], + ) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step1_resolve_source/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step1_resolve_source/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step1_resolve_source/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step1_resolve_source/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step1_resolve_source/step.py new file mode 100644 index 0000000..268b985 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step1_resolve_source/step.py @@ -0,0 +1,54 @@ +from __future__ import annotations + +import re +from typing import Any + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) +from app.core.agent.utils.workflow import WorkflowStep + + +class ResolveSourceStep(WorkflowStep[DocUpdateFromFeatureV2Context]): + step_id = "step1_resolve_source" + title = "Определение источника аналитики" + + _PATH_PATTERN = re.compile(r"(/[^\n`]+?\.md)") + _URL_PATTERN = re.compile(r"https?://[^\s)]+") + + async def run(self, context: DocUpdateFromFeatureV2Context) -> DocUpdateFromFeatureV2Context: + if context.answer: + return context + query = context.route.user_query + path = self._extract_path(query) + if path: + context.source_ref = path + context.source_kind = "markdown_file" + return context + url = self._extract_url(query) + if url: + context.source_ref = url + context.source_kind = "confluence_url" if "confluence" in url.lower() else "url" + return context + context.issues.append("Не удалось определить источник системной аналитики (ожидался путь .md или URL).") + return context + + def _extract_path(self, query: str) -> str: + if "`" in query: + for chunk in query.split("`"): + value = chunk.strip().strip('"').strip("'") + if value.endswith(".md") and value.startswith("/"): + return value + match = self._PATH_PATTERN.search(query) + return match.group(1).strip().strip('"').strip("'") if match else "" + + def _extract_url(self, query: str) -> str: + match = self._URL_PATTERN.search(query) + return match.group(0).strip() if match else "" + + def trace_input(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + query = str(context.route.user_query or "") + return {"query_excerpt": query[:300], "query_len": len(query)} + + def trace_output(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return {"source_kind": context.source_kind, "source_ref": context.source_ref} diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step2_load_source_content/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step2_load_source_content/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step2_load_source_content/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step2_load_source_content/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step2_load_source_content/step.py new file mode 100644 index 0000000..6701c2e --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step2_load_source_content/step.py @@ -0,0 +1,54 @@ +from __future__ import annotations + +from pathlib import Path +from typing import Any + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) +from app.core.agent.utils.workflow import WorkflowStep + + +class LoadSourceContentStep(WorkflowStep[DocUpdateFromFeatureV2Context]): + step_id = "step2_load_source_content" + title = "Загрузка системной аналитики" + + async def run(self, context: DocUpdateFromFeatureV2Context) -> DocUpdateFromFeatureV2Context: + if context.answer: + return context + if not context.source_ref: + return context + if context.source_kind == "confluence_url": + context.issues.append("Confluence source пока не реализован (stub).") + return context + if context.source_kind != "markdown_file": + context.issues.append("Поддерживается только markdown-файл (.md).") + return context + + source_path = Path(context.source_ref) + if not source_path.exists() or not source_path.is_file(): + context.issues.append(f"Файл системной аналитики не найден: {context.source_ref}") + return context + try: + context.source_content = source_path.read_text(encoding="utf-8") + context.project_root = self._resolve_project_root(source_path).as_posix() + except Exception as exc: + context.issues.append(f"Не удалось прочитать системную аналитику: {exc}") + return context + + def _resolve_project_root(self, source_path: Path) -> Path: + parts = list(source_path.parts) + if "_incoming" in parts: + idx = parts.index("_incoming") + if idx > 0: + return Path(*parts[:idx]) + return source_path.parent + + def trace_input(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return {"source_kind": context.source_kind, "source_ref": context.source_ref} + + def trace_output(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return { + "project_root": context.project_root, + "source_content_len": len(context.source_content or ""), + } diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/parser.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/parser.py new file mode 100644 index 0000000..902bfe0 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/parser.py @@ -0,0 +1,168 @@ +from __future__ import annotations + +import re + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import ( + AnalyticsMeta, + RequirementUnit, +) + + +class MarkdownHeadingScanner: + _HEADING_RE = re.compile(r"^(#{1,6})\s+(.+?)\s*$") + _ROOT_RE = re.compile(r"^(?:6(?:[.)\s]|$)|функциональные требования\b|описание изменений\b)", re.IGNORECASE) + _SECTION_RE = re.compile(r"^6(?:\.\d+)+(?:\s|$|[.)])") + + def find_root(self, lines: list[str]) -> tuple[int, int, int] | None: + headings = list(self.iter_headings(lines)) + for idx, (line_index, level, title) in enumerate(headings): + if not self._ROOT_RE.match(title.strip()): + continue + end = len(lines) + for next_line, next_level, _ in headings[idx + 1 :]: + if next_level <= level: + end = next_line + break + return line_index, level, end + return None + + def split_sections(self, lines: list[str], *, section_level: int) -> tuple[list[str], list[tuple[str, list[str]]]]: + meta_lines: list[str] = [] + sections: list[tuple[str, list[str]]] = [] + current_title = "" + current_body: list[str] = [] + seen_section = False + + for raw in lines: + heading = self._match_heading(raw) + if heading and heading[0] == section_level and self._SECTION_RE.match(heading[1].strip()): + if current_title: + sections.append((current_title, current_body)) + current_title = heading[1].strip() + current_body = [] + seen_section = True + continue + if current_title: + current_body.append(raw) + elif not seen_section: + meta_lines.append(raw) + + if current_title: + sections.append((current_title, current_body)) + return meta_lines, sections + + def iter_headings(self, lines: list[str]) -> list[tuple[int, int, str]]: + items: list[tuple[int, int, str]] = [] + for index, raw in enumerate(lines): + heading = self._match_heading(raw) + if heading: + items.append((index, heading[0], heading[1])) + return items + + def _match_heading(self, raw: str) -> tuple[int, str] | None: + match = self._HEADING_RE.match(raw.strip()) + if not match: + return None + return len(match.group(1)), match.group(2).strip() + + +class MarkdownMetadataParser: + _KEY_VALUE_RE = re.compile(r"^[-*]?\s*`?([A-Za-z_][A-Za-z0-9_-]*)`?\s*:\s*(.*)$") + + def parse_block(self, lines: list[str]) -> dict[str, str]: + values: dict[str, str] = {} + for raw in lines: + line = raw.strip() + if not line: + continue + match = self._KEY_VALUE_RE.match(line) + if not match: + break + key = match.group(1).strip().lower() + value = self._normalize_value(match.group(2)) + values[key] = value + return values + + def split_metadata_and_body(self, lines: list[str]) -> tuple[dict[str, str], list[str]]: + metadata: dict[str, str] = {} + body_index = 0 + for idx, raw in enumerate(lines): + line = raw.strip() + if not line: + body_index = idx + 1 + continue + match = self._KEY_VALUE_RE.match(line) + if not match: + break + key = match.group(1).strip().lower() + value = self._normalize_value(match.group(2)) + metadata[key] = value + body_index = idx + 1 + return metadata, lines[body_index:] + + def _normalize_value(self, value: str) -> str: + return value.strip().strip("`").strip('"').strip("'").strip() + + +class FunctionalRequirementsParser: + _SECTION_KEY_RE = re.compile(r"^(6(?:\.\d+)+)[.)\s-]*(.*)$") + + def __init__( + self, + scanner: MarkdownHeadingScanner | None = None, + metadata_parser: MarkdownMetadataParser | None = None, + ) -> None: + self._scanner = scanner or MarkdownHeadingScanner() + self._metadata_parser = metadata_parser or MarkdownMetadataParser() + + def parse(self, content: str) -> tuple[AnalyticsMeta, list[RequirementUnit]]: + lines = content.splitlines() + meta = self._parse_preamble_meta(lines) + root = self._scanner.find_root(lines) + if root is None: + return meta, [] + + start, level, end = root + root_meta_lines, sections = self._scanner.split_sections(lines[start + 1 : end], section_level=level + 1) + root_meta = self._metadata_parser.parse_block(root_meta_lines) + meta.domain = root_meta.get("domain", meta.domain) + meta.subdomain = root_meta.get("sub_domain", root_meta.get("subdomain", meta.subdomain)) + meta.application = root_meta.get("application", meta.application) + meta.platform = root_meta.get("platform", meta.platform) + + units: list[RequirementUnit] = [] + for raw_heading, body_lines in sections: + metadata, body = self._metadata_parser.split_metadata_and_body(body_lines) + section_key, heading = self._split_heading(raw_heading) + units.append( + RequirementUnit( + section_key=section_key, + heading=heading, + body="\n".join(body).strip(), + metadata=metadata, + ) + ) + return meta, units + + def _parse_preamble_meta(self, lines: list[str]) -> AnalyticsMeta: + preamble: list[str] = [] + for raw in lines: + if raw.strip().startswith("#"): + break + preamble.append(raw) + values = self._metadata_parser.parse_block(preamble) + return AnalyticsMeta( + analysis_id=values.get("analysis_id", ""), + application=values.get("application", ""), + platform=values.get("platform", ""), + domain=values.get("domain", ""), + subdomain=values.get("sub_domain", values.get("subdomain", "")), + ) + + def _split_heading(self, raw_heading: str) -> tuple[str, str]: + match = self._SECTION_KEY_RE.match(raw_heading.strip()) + if not match: + return "", raw_heading.strip() + section_key = match.group(1).strip() + heading = match.group(2).strip() or section_key + return section_key, heading diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/step.py new file mode 100644 index 0000000..cdc72b5 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step3_parse_requirements/step.py @@ -0,0 +1,56 @@ +from __future__ import annotations + +from typing import Any + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step3_parse_requirements.parser import ( + FunctionalRequirementsParser, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) +from app.core.agent.utils.workflow import WorkflowStep + + +class ParseRequirementsStep(WorkflowStep[DocUpdateFromFeatureV2Context]): + step_id = "step3_parse_requirements" + title = "Парсинг раздела функциональных требований" + + def __init__(self, parser: FunctionalRequirementsParser | None = None) -> None: + self._parser = parser or FunctionalRequirementsParser() + + async def run(self, context: DocUpdateFromFeatureV2Context) -> DocUpdateFromFeatureV2Context: + if context.answer or not context.source_content: + return context + meta, units = self._parser.parse(context.source_content) + context.analytics_meta = meta + context.requirements = units + + if not units: + context.issues.append( + "Не найден раздел 6 с подразделами 6.x для генерации страниц документации." + ) + if not context.analytics_meta.analysis_id: + context.issues.append("Не найден metadata-тег analysis_id в начале аналитики.") + return context + + def trace_input(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return {"source_content_len": len(context.source_content or "")} + + def trace_output(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return { + "analytics_meta": { + "analysis_id": context.analytics_meta.analysis_id, + "application": context.analytics_meta.application, + "platform": context.analytics_meta.platform, + "domain": context.analytics_meta.domain, + "sub_domain": context.analytics_meta.subdomain, + }, + "requirements": [ + { + "section_key": item.section_key, + "heading": item.heading, + "metadata": dict(item.metadata), + } + for item in context.requirements + ], + } diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_load_rules/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_load_rules/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_load_rules/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_load_rules/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_load_rules/step.py new file mode 100644 index 0000000..c9a4a46 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_load_rules/step.py @@ -0,0 +1,57 @@ +from __future__ import annotations + +from pathlib import Path +from typing import Any + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RuleDocument +from app.core.agent.utils.workflow import WorkflowStep + + +class LoadRulesStep(WorkflowStep[DocUpdateFromFeatureV2Context]): + step_id = "step5_load_rules" + title = "Загрузка правил документации v3" + + def __init__(self, rules_root: Path | None = None) -> None: + self._rules_root = rules_root or self._discover_rules_root() + + async def run(self, context: DocUpdateFromFeatureV2Context) -> DocUpdateFromFeatureV2Context: + if context.answer: + return context + if not self._rules_root.exists(): + context.issues.append(f"Папка rules не найдена: {self._rules_root.as_posix()}") + return context + loaded: list[RuleDocument] = [] + for item in sorted(self._rules_root.rglob("*.md")): + try: + loaded.append( + RuleDocument( + name=item.relative_to(self._rules_root).as_posix(), + content=item.read_text(encoding="utf-8"), + ) + ) + except Exception as exc: + context.issues.append(f"Не удалось прочитать rule {item.name}: {exc}") + context.rules = loaded + if not context.rules: + context.issues.append("Rules v2 пустые: не найдено ни одного *.md файла.") + return context + + def _discover_rules_root(self) -> Path: + current = Path(__file__).resolve() + for parent in current.parents: + candidate = parent / "_process" / "doc_rules_v3" + if candidate.exists(): + return candidate + return current.parents[9] / "_process" / "doc_rules_v3" + + def trace_input(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return {"rules_root": self._rules_root.as_posix()} + + def trace_output(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return { + "rules_count": len(context.rules), + "rule_names": [item.name for item in context.rules], + } diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/__init__.py new file mode 100644 index 0000000..f41e2e1 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/__init__.py @@ -0,0 +1,5 @@ +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step4_prepare_tasks.step import ( + PrepareRequirementTasksStep, +) + +__all__ = ["PrepareRequirementTasksStep"] diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/services.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/services.py new file mode 100644 index 0000000..b504dc9 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/services.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step5_execute_subprocesses.path_resolver import ( + DocsPathResolver, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step5_execute_subprocesses.services import ( + TaskActionResolver, + TaskAttributeResolver, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import ( + RequirementTaskContext, +) +from app.core.agent.utils.llm import AgentLlmService + +if TYPE_CHECKING: + from app.core.rag.persistence.query_repository import RagQueryRepository + + +class DocsCatalogLoader: + def __init__(self, query_repository: "RagQueryRepository | None" = None) -> None: + self._query_repository = query_repository + + def load(self, context: DocUpdateFromFeatureV2Context) -> None: + if not context.rag_session_id: + context.issues.append("Отсутствует active RAG session: fallback по структуре документации будет ограничен.") + return + repository = self._query_repository or self._build_repository() + try: + context.docs_catalog_rows = repository.list_docs_scope_index_rows(context.rag_session_id) + except Exception as exc: + context.issues.append(f"Не удалось загрузить docs catalog rows: {exc}") + + def _build_repository(self) -> "RagQueryRepository": + from app.core.rag.persistence.query_repository import RagQueryRepository + + self._query_repository = RagQueryRepository() + return self._query_repository + + +class RequirementTaskBuilder: + def __init__(self, llm: AgentLlmService) -> None: + self._path_resolver = DocsPathResolver() + self._attribute_resolver = TaskAttributeResolver(llm) + self._action_resolver = TaskActionResolver(llm) + + def build(self, context: DocUpdateFromFeatureV2Context) -> list[RequirementTaskContext]: + known_paths = {str(row.get("path") or "") for row in context.docs_catalog_rows} + tasks: list[RequirementTaskContext] = [] + for index, requirement in enumerate(context.requirements): + task = RequirementTaskContext( + index=index, + section_key=requirement.section_key or f"6.{index + 1}", + heading=requirement.heading, + body=requirement.body, + metadata=dict(requirement.metadata), + ) + self._attribute_resolver.resolve(context, task, rules_text="") + task.path = self._path_resolver.resolve( + application=task.application, + platform=task.platform, + doc_type=task.doc_type, + doc_id=task.doc_id, + domain=task.domain, + ) + task.action = self._action_resolver.resolve(task, known_paths) + known_paths.add(task.path) + tasks.append(task) + return tasks + + +class RequirementTaskOrderer: + _PLATFORM_PRIORITY = {"pprb": 0, "ufs": 1, "web": 2} + + def order(self, tasks: list[RequirementTaskContext]) -> list[RequirementTaskContext]: + return sorted(tasks, key=self._sort_key) + + def _sort_key(self, task: RequirementTaskContext) -> tuple[int, int, int]: + explicit_order = self._explicit_order(task.metadata) + platform_order = self._PLATFORM_PRIORITY.get(task.platform, len(self._PLATFORM_PRIORITY)) + return explicit_order, platform_order, task.index + + def _explicit_order(self, metadata: dict[str, object]) -> int: + value = str(metadata.get("build_order") or metadata.get("order") or "").strip() + return int(value) if value.isdigit() else 1000 diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/step.py new file mode 100644 index 0000000..d73bb58 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step4_prepare_tasks/step.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING +from typing import Any + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step4_prepare_tasks.services import ( + DocsCatalogLoader, + RequirementTaskBuilder, + RequirementTaskOrderer, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) +from app.core.agent.utils.llm import AgentLlmService +from app.core.agent.utils.workflow import WorkflowStep + +if TYPE_CHECKING: + from app.core.rag.persistence.query_repository import RagQueryRepository + + +class PrepareRequirementTasksStep(WorkflowStep[DocUpdateFromFeatureV2Context]): + step_id = "step4_prepare_tasks" + title = "Подготовка задач по страницам документации" + + def __init__(self, llm: AgentLlmService, query_repository: "RagQueryRepository | None" = None) -> None: + self._catalog_loader = DocsCatalogLoader(query_repository=query_repository) + self._task_builder = RequirementTaskBuilder(llm) + self._task_orderer = RequirementTaskOrderer() + + async def run(self, context: DocUpdateFromFeatureV2Context) -> DocUpdateFromFeatureV2Context: + if context.answer or not context.requirements: + return context + self._catalog_loader.load(context) + context.requirement_tasks = self._task_orderer.order(self._task_builder.build(context)) + if not context.requirement_tasks: + context.issues.append("Не удалось подготовить задачи по разделу 6 аналитики.") + return context + + def trace_input(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return { + "requirements_count": len(context.requirements), + "requirements": [ + {"section_key": item.section_key, "heading": item.heading, "metadata": dict(item.metadata)} + for item in context.requirements + ], + } + + def trace_output(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return { + "docs_catalog_rows_count": len(context.docs_catalog_rows), + "tasks": [ + { + "section_key": item.section_key, + "heading": item.heading, + "doc_id": item.doc_id, + "doc_type": item.doc_type, + "application": item.application, + "platform": item.platform, + "domain": item.domain, + "sub_domain": item.subdomain, + "action": item.action.value, + "path": item.path, + } + for item in context.requirement_tasks + ], + } diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/classifier.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/classifier.py new file mode 100644 index 0000000..87cfd24 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/classifier.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +import re + + +class DeleteIntentHeuristic: + _PATTERNS = ( + re.compile(r"\bdelete\b"), + re.compile(r"\bremove\b"), + re.compile(r"\bdecommission(?:ed|ing)?\b"), + re.compile(r"\bудал(?:ить|ение|яем|яется|ен[аоы]?|ить страницу|ить документ)\b"), + re.compile(r"\bдекомисс"), + ) + + def is_delete(self, text: str) -> bool: + lowered = (text or "").lower() + return any(pattern.search(lowered) for pattern in self._PATTERNS) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/path_resolver.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/path_resolver.py new file mode 100644 index 0000000..c7328e2 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/path_resolver.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +import re + + +class DocsPathResolver: + def resolve(self, *, application: str, platform: str, doc_type: str, doc_id: str, domain: str = "") -> str: + root = self._clean(domain) or self._clean(application) or "common" + plat = self._clean(platform) or "web" + dtype = self._clean(doc_type) or "misc" + did = self._clean(doc_id) or "untitled" + return f"docs/{root}/{plat}/{dtype}/{did}.md" + + def _clean(self, value: str) -> str: + normalized = re.sub(r"[^a-zA-Z0-9._-]+", "-", (value or "").strip().lower()) + return normalized.strip(".-") diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/prompts/prompts.yml b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/prompts/prompts.yml new file mode 100644 index 0000000..8431df5 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/prompts/prompts.yml @@ -0,0 +1,11 @@ +namespace: v2_docs_update_v2 + +prompts: + resolve_attributes_fallback: | + Определи недостающие атрибуты страницы документации по секции аналитики и структуре docs catalog. + Верни только JSON-объект с полями: doc_type, id, application, platform, domain, sub_domain. + Не добавляй пояснений. + + classify_action: | + Классифицируй действие для страницы документации. + Верни только JSON: {"action":"create|update|delete"}. diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/services.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/services.py new file mode 100644 index 0000000..819cfc4 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/services.py @@ -0,0 +1,225 @@ +from __future__ import annotations + +import hashlib +import json +import re +from pathlib import Path + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step5_execute_subprocesses.classifier import ( + DeleteIntentHeuristic, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.create_doc import ( + CreateDocSubprocess, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.delete_doc import ( + DeleteDocSubprocess, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.edit_doc import EditDocSubprocess +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import ( + AccumulatedPageDraft, + DocAction, + RequirementTaskContext, +) +from app.core.agent.utils.llm import AgentLlmService +from app.schemas.changeset import ChangeItem, ChangeOp + + +class TaskAttributeResolver: + def __init__(self, llm: AgentLlmService) -> None: + self._llm = llm + + def resolve(self, context: DocUpdateFromFeatureV2Context, task: RequirementTaskContext, rules_text: str) -> None: + task.doc_type = str(task.metadata.get("doc_type") or task.metadata.get("type") or "").strip() + task.doc_id = str(task.metadata.get("id") or self._slug(task.heading)).strip() + task.application = str(task.metadata.get("application") or context.analytics_meta.application or "").strip() + task.platform = str(task.metadata.get("platform") or context.analytics_meta.platform or "").strip().lower() + task.domain = str(task.metadata.get("domain") or context.analytics_meta.domain or "").strip() + task.subdomain = str( + task.metadata.get("sub_domain") or task.metadata.get("subdomain") or context.analytics_meta.subdomain or "" + ).strip() + missing = [ + name + for name, value in [ + ("doc_type", task.doc_type), + ("id", task.doc_id), + ("application", task.application), + ("platform", task.platform), + ("domain", task.domain), + ("sub_domain", task.subdomain), + ] + if not value + ] + if not missing: + return + payload = { + "missing": missing, + "full_document": context.source_content, + "requirement": {"heading": task.heading, "body": task.body, "metadata": task.metadata}, + "docs_catalog_paths": [str(row.get("path") or "") for row in context.docs_catalog_rows[:300]], + "rules": rules_text, + } + raw = self._llm.generate( + "v2_docs_update_v2.resolve_attributes_fallback", + json.dumps(payload, ensure_ascii=False, indent=2), + log_context="workflow.v2.docs_update.from_feature_v2.resolve_attributes", + ) + parsed = self._json_or_empty(raw) + task.doc_type = task.doc_type or str(parsed.get("doc_type") or parsed.get("type") or "").strip() + task.doc_id = task.doc_id or str(parsed.get("id") or self._slug(task.heading)).strip() + task.application = task.application or str(parsed.get("application") or "").strip() + task.platform = task.platform or str(parsed.get("platform") or "web").strip().lower() + task.domain = task.domain or str(parsed.get("domain") or "").strip() + task.subdomain = task.subdomain or str(parsed.get("sub_domain") or parsed.get("subdomain") or "").strip() + + def _slug(self, value: str) -> str: + return re.sub(r"[^a-z0-9._-]+", "-", (value or "").strip().lower()).strip(".-") or "untitled" + + def _json_or_empty(self, raw: str) -> dict[str, object]: + value = str(raw or "").strip() + if not value: + return {} + try: + payload = json.loads(value) + return payload if isinstance(payload, dict) else {} + except Exception: + return {} + + +class TaskActionResolver: + def __init__(self, llm: AgentLlmService) -> None: + self._llm = llm + self._delete_heuristic = DeleteIntentHeuristic() + + def resolve(self, task: RequirementTaskContext, known_paths: set[str]) -> DocAction: + explicit = self._explicit_action(task) + if explicit is not None: + return explicit + if self._delete_heuristic.is_delete(task.body): + return DocAction.DELETE + return DocAction.EDIT if task.path in known_paths else DocAction.CREATE + + def _explicit_action(self, task: RequirementTaskContext) -> DocAction | None: + value = str(task.metadata.get("action") or task.metadata.get("op") or task.metadata.get("operation") or "") + normalized = value.strip().lower() + if normalized in {"create", "add", "new"}: + return DocAction.CREATE + if normalized in {"update", "edit", "modify"}: + return DocAction.EDIT + if normalized in {"delete", "remove"}: + return DocAction.DELETE + return None + +class TaskChangeExecutor: + def __init__(self, llm: AgentLlmService) -> None: + self._create = CreateDocSubprocess(llm) + self._edit = EditDocSubprocess(llm) + self._delete = DeleteDocSubprocess() + + def execute(self, context: DocUpdateFromFeatureV2Context, task: RequirementTaskContext) -> None: + shared_context = self._build_shared_context(context) + if task.action == DocAction.CREATE: + result = self._create.run(task, rule_documents=context.rules, shared_context=shared_context) + context.changeset.append( + ChangeItem(op=ChangeOp.CREATE, path=task.path, proposed_content=result.content, reason=task.heading) + ) + self._remember_change(context, task, result.content) + return + if task.action == DocAction.EDIT: + current_content, base_hash = self._load_current_content(context, task.path) + if not current_content or not base_hash: + context.issues.append(f"Пропущен UPDATE для {task.path}: не найден текущий файл.") + return + result = self._edit.run( + task, + current_content=current_content, + rule_documents=context.rules, + shared_context=shared_context, + ) + context.changeset.append( + ChangeItem( + op=ChangeOp.UPDATE, + path=task.path, + base_hash=base_hash, + proposed_content=result.content, + reason=task.heading, + ) + ) + self._remember_change(context, task, result.content) + return + _, base_hash = self._load_current_content(context, task.path) + if not base_hash: + context.issues.append(f"Пропущен DELETE для {task.path}: не найден текущий файл.") + return + self._delete.run(task) + context.changeset.append(ChangeItem(op=ChangeOp.DELETE, path=task.path, base_hash=base_hash, reason=task.heading)) + self._remember_change(context, task, "") + + def _build_shared_context(self, context: DocUpdateFromFeatureV2Context) -> dict[str, object]: + return { + "analytics_meta": { + "analysis_id": context.analytics_meta.analysis_id, + "application": context.analytics_meta.application, + "platform": context.analytics_meta.platform, + "domain": context.analytics_meta.domain, + "sub_domain": context.analytics_meta.subdomain, + }, + "planned_pages": [ + { + "section_key": item.section_key, + "heading": item.heading, + "path": item.path, + "doc_id": item.doc_id, + "doc_type": item.doc_type, + "platform": item.platform, + "application": item.application, + "domain": item.domain, + "sub_domain": item.subdomain, + "action": item.action.value, + } + for item in context.requirement_tasks + ], + "accumulated_pages": [ + { + "path": item.path, + "heading": item.heading, + "doc_id": item.doc_id, + "doc_type": item.doc_type, + "platform": item.platform, + "action": item.action.value, + "content": item.content, + } + for item in context.accumulated_pages + ], + } + + def _load_current_content(self, context: DocUpdateFromFeatureV2Context, rel_path: str) -> tuple[str, str]: + for item in reversed(context.accumulated_pages): + if item.path == rel_path and item.action != DocAction.DELETE: + content = item.content + return content, hashlib.sha256(content.encode("utf-8")).hexdigest() + root = Path(context.project_root or "") + if not root.is_absolute(): + return "", "" + target = root / rel_path + if not target.exists() or not target.is_file(): + return "", "" + content = target.read_text(encoding="utf-8") + base_hash = hashlib.sha256(content.encode("utf-8")).hexdigest() + return content, base_hash + + def _remember_change(self, context: DocUpdateFromFeatureV2Context, task: RequirementTaskContext, content: str) -> None: + context.accumulated_pages = [item for item in context.accumulated_pages if item.path != task.path] + context.accumulated_pages.append( + AccumulatedPageDraft( + path=task.path, + heading=task.heading, + doc_id=task.doc_id, + doc_type=task.doc_type, + platform=task.platform, + action=task.action, + content=content, + ) + ) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/step.py new file mode 100644 index 0000000..25ad820 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/step.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +from typing import Any + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step5_execute_subprocesses.services import ( + TaskChangeExecutor, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) +from app.core.agent.utils.llm import AgentLlmService +from app.core.agent.utils.workflow import WorkflowStep + + +class ExecuteRequirementSubprocessesStep(WorkflowStep[DocUpdateFromFeatureV2Context]): + step_id = "step6_execute_subprocesses" + title = "Выполнение подпроцессов create/edit/delete" + + def __init__(self, llm: AgentLlmService) -> None: + self._change_executor = TaskChangeExecutor(llm) + + async def run(self, context: DocUpdateFromFeatureV2Context) -> DocUpdateFromFeatureV2Context: + if context.answer or not context.requirement_tasks: + return context + for task in context.requirement_tasks: + self._change_executor.execute(context, task) + return context + + def trace_input(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return { + "tasks": [ + { + "section_key": item.section_key, + "heading": item.heading, + "action": item.action.value, + "path": item.path, + "doc_type": item.doc_type, + } + for item in context.requirement_tasks + ], + "rules_count": len(context.rules), + } + + def trace_output(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return { + "changeset": [ + {"op": item.op.value, "path": item.path, "reason": item.reason} + for item in context.changeset + ], + "accumulated_pages": [ + { + "path": item.path, + "doc_id": item.doc_id, + "doc_type": item.doc_type, + "action": item.action.value, + } + for item in context.accumulated_pages + ], + } diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step6_finalize/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step6_finalize/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step6_finalize/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step6_finalize/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step6_finalize/step.py new file mode 100644 index 0000000..467426c --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step6_finalize/step.py @@ -0,0 +1,58 @@ +from __future__ import annotations + +import json +from typing import Any + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) +from app.core.agent.utils.workflow import WorkflowStep + + +class FinalizeAnswerStep(WorkflowStep[DocUpdateFromFeatureV2Context]): + step_id = "step7_finalize" + title = "Формирование итогового ответа" + + async def run(self, context: DocUpdateFromFeatureV2Context) -> DocUpdateFromFeatureV2Context: + if context.answer: + return context + lines: list[str] = ["DOC_UPDATE/FROM_FEATURE v2: сформирован changeset."] + if context.issues: + lines.append("\nIssues:") + for issue in context.issues: + lines.append(f"- {issue}") + lines.append("\nTasks:") + for task in context.requirement_tasks: + lines.append( + f"- {task.section_key or f'#{task.index + 1}'} {task.action.value}: {task.path}" + f" [{task.platform or '-'} | {task.doc_type or '-'}]" + ) + if not context.requirement_tasks: + lines.append("- Нет задач для обработки.") + lines.append("\nChangeset:") + lines.append("```json") + lines.append(json.dumps([item.model_dump() for item in context.changeset], ensure_ascii=False, indent=2)) + lines.append("```") + context.apply_changeset = bool(context.changeset) + lines.append(f"\napply_changeset: {str(context.apply_changeset).lower()}") + context.answer = "\n".join(lines) + context.answer_generated_payload = { + "answer_mode": "docs_update_changeset_v2", + "changeset_items": len(context.changeset), + "apply_changeset": context.apply_changeset, + } + return context + + def trace_input(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return { + "tasks_count": len(context.requirement_tasks), + "changeset_count": len(context.changeset), + "issues_count": len(context.issues), + } + + def trace_output(self, context: DocUpdateFromFeatureV2Context) -> dict[str, Any]: + return { + "answer_generated_payload": dict(context.answer_generated_payload or {}), + "answer_len": len(context.answer or ""), + "apply_changeset": context.apply_changeset, + } diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/__init__.py new file mode 100644 index 0000000..e36595d --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/__init__.py @@ -0,0 +1,10 @@ +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.models import ( + SubprocessResult, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_models import ( + SectionDraft, + TemplateSection, + TemplateSpec, +) + +__all__ = ["SectionDraft", "SubprocessResult", "TemplateSection", "TemplateSpec"] diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/document_composer.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/document_composer.py new file mode 100644 index 0000000..69dbec9 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/document_composer.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +import re + +import yaml + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_models import ( + SectionDraft, + TemplateSpec, +) + + +class TemplateDocumentComposer: + def compose(self, template: TemplateSpec, frontmatter: str, sections: list[SectionDraft], fallback_title: str) -> str: + title = self._extract_title(frontmatter) or fallback_title + section_map = {(item.level, item.title): item.content.strip() for item in sections} + lines = [frontmatter.strip(), "", f"{'#' * template.title_level} {title}", ""] + for section in template.sections: + lines.append(f"{'#' * section.level} {section.title}") + content = section_map.get((section.level, section.title), "") + if content: + lines.extend(["", content, ""]) + continue + lines.append("") + return "\n".join(lines).strip() + "\n" + + def _extract_title(self, frontmatter: str) -> str: + value = frontmatter.strip() + match = re.match(r"^---\n(.*?)\n---$", value, re.DOTALL) + if not match: + return "" + payload = yaml.safe_load(match.group(1)) or {} + return str(payload.get("title") or "").strip() if isinstance(payload, dict) else "" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/models.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/models.py new file mode 100644 index 0000000..9f55346 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/models.py @@ -0,0 +1,12 @@ +from __future__ import annotations + +from dataclasses import dataclass + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext + + +@dataclass(slots=True) +class SubprocessResult: + task: RequirementTaskContext + content: str | None + issue: str = "" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/rules_catalog.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/rules_catalog.py new file mode 100644 index 0000000..29882ab --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/rules_catalog.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +from dataclasses import dataclass + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RuleDocument + + +@dataclass(slots=True) +class RulesCatalog: + by_name: dict[str, str] + + @classmethod + def from_documents(cls, rules: list[RuleDocument]) -> "RulesCatalog": + return cls(by_name={item.name: item.content for item in rules}) + + def template_text(self, doc_type: str) -> str: + return self.by_name.get(f"templates/{doc_type}.template.md", "") + + def section_text(self, rule_path: str) -> str: + return self.by_name.get(rule_path, "") + + def global_text(self) -> str: + parts: list[str] = [] + documentation_rules = self.by_name.get("documentation-rules.md", "").strip() + if documentation_rules: + parts.append("## documentation-rules.md") + parts.append(documentation_rules) + for name in sorted(self.by_name): + if not name.startswith("global/"): + continue + value = self.by_name.get(name, "").strip() + if not value: + continue + parts.append(f"## {name}") + parts.append(value) + return "\n\n".join(parts).strip() diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/source_sections.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/source_sections.py new file mode 100644 index 0000000..5bd5d0d --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/source_sections.py @@ -0,0 +1,56 @@ +from __future__ import annotations + +import re + + +class RequirementSourceSections: + _HEADING_RE = re.compile(r"^(#{2,6})\s+(.+?)\s*$") + + def extract(self, text: str) -> dict[str, str]: + sections: dict[str, str] = {} + current_key = "" + current_level = 0 + current_lines: list[str] = [] + for raw in text.splitlines(): + heading = self._match_heading(raw) + if heading: + level, title = heading + if current_key and level <= current_level: + sections[current_key] = "\n".join(current_lines).strip() + current_key = "" + current_lines = [] + normalized = self._normalize(title) + if level >= 3: + if current_key: + sections[current_key] = "\n".join(current_lines).strip() + current_key = normalized + current_level = level + current_lines = [] + continue + if current_key: + current_lines.append(raw) + if current_key: + sections[current_key] = "\n".join(current_lines).strip() + return sections + + def find_for_title(self, sections: dict[str, str], title: str) -> str: + normalized = self._normalize(title) + if normalized in sections: + return sections[normalized] + for key, value in sections.items(): + if key.startswith(normalized) or normalized.startswith(key): + return value + return "" + + def _match_heading(self, raw: str) -> tuple[int, str] | None: + match = self._HEADING_RE.match(raw.strip()) + if not match: + return None + return len(match.group(1)), match.group(2).strip() + + def _normalize(self, value: str) -> str: + text = value.lower().replace("ё", "е") + text = text.replace("контракт метода", "контракт") + text = text.replace("технический use case (тезисно)", "технический use case") + text = re.sub(r"[^a-zа-я0-9]+", " ", text) + return re.sub(r"\s+", " ", text).strip() diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_models.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_models.py new file mode 100644 index 0000000..3c12325 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_models.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +from dataclasses import dataclass +from dataclasses import field + + +@dataclass(slots=True) +class TemplateSection: + title: str + level: int + rule_path: str = "" + has_children: bool = False + + +@dataclass(slots=True) +class TemplateSpec: + doc_type: str + source_name: str + template_text: str + title_level: int = 1 + sections: list[TemplateSection] = field(default_factory=list) + + +@dataclass(slots=True) +class SectionDraft: + title: str + level: int + content: str diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_parser.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_parser.py new file mode 100644 index 0000000..2eb7087 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_parser.py @@ -0,0 +1,83 @@ +from __future__ import annotations + +import re + +import yaml + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_models import ( + TemplateSection, + TemplateSpec, +) + + +class TemplateParser: + _HEADING_RE = re.compile(r"^(#{1,6})\s+(.+?)\s*$") + _RULE_REF_RE = re.compile(r"`(\.\./common-elements/[^`]+|common-elements/[^`]+)`") + + def parse(self, source_name: str, template_text: str) -> TemplateSpec: + _, body = self._split_frontmatter(template_text) + doc_type = self._doc_type(template_text, source_name) + title_level = 1 + sections: list[TemplateSection] = [] + lines = body.splitlines() + index = 0 + while index < len(lines): + heading = self._match_heading(lines[index]) + if not heading: + index += 1 + continue + level, title = heading + if "<title>" in title: + title_level = level + index += 1 + continue + rule_path = self._extract_rule_path(lines, index + 1) + sections.append(TemplateSection(title=title, level=level, rule_path=rule_path)) + index += 1 + self._mark_children(sections) + return TemplateSpec( + doc_type=doc_type, + source_name=source_name, + template_text=template_text, + title_level=title_level, + sections=sections, + ) + + def _split_frontmatter(self, text: str) -> tuple[dict[str, object], str]: + value = text.strip() + if not value.startswith("---\n"): + return {}, text + _, _, tail = value.partition("---\n") + frontmatter_text, _, body = tail.partition("\n---\n") + payload = yaml.safe_load(frontmatter_text) or {} + return payload if isinstance(payload, dict) else {}, body + + def _doc_type(self, text: str, source_name: str) -> str: + frontmatter, _ = self._split_frontmatter(text) + doc_type = str(frontmatter.get("doc_type") or "").strip() + if doc_type: + return doc_type + suffix = ".template.md" + filename = source_name.split("/")[-1] + return filename[: -len(suffix)] if filename.endswith(suffix) else filename + + def _match_heading(self, line: str) -> tuple[int, str] | None: + match = self._HEADING_RE.match(line.strip()) + if not match: + return None + return len(match.group(1)), match.group(2).strip() + + def _extract_rule_path(self, lines: list[str], start: int) -> str: + limit = min(len(lines), start + 4) + for index in range(start, limit): + match = self._RULE_REF_RE.search(lines[index]) + if not match: + continue + return match.group(1).replace("../", "") + return "" + + def _mark_children(self, sections: list[TemplateSection]) -> None: + for index, section in enumerate(sections): + if index + 1 >= len(sections): + continue + section.has_children = sections[index + 1].level > section.level diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_registry.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_registry.py new file mode 100644 index 0000000..905a497 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/common/template_registry.py @@ -0,0 +1,23 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.rules_catalog import ( + RulesCatalog, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_models import ( + TemplateSpec, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_parser import ( + TemplateParser, +) + + +class TemplateRegistry: + def __init__(self, parser: TemplateParser | None = None) -> None: + self._parser = parser or TemplateParser() + + def load(self, catalog: RulesCatalog, doc_type: str) -> TemplateSpec: + template_name = f"templates/{doc_type}.template.md" + template_text = catalog.template_text(doc_type) + if not template_text.strip(): + raise ValueError(f"Template not found for doc_type '{doc_type}'") + return self._parser.parse(template_name, template_text) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/__init__.py new file mode 100644 index 0000000..c2085a8 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/__init__.py @@ -0,0 +1,5 @@ +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.create_doc.process import ( + CreateDocSubprocess, +) + +__all__ = ["CreateDocSubprocess"] diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/process.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/process.py new file mode 100644 index 0000000..52bb330 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/process.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common import SubprocessResult +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.document_composer import ( + TemplateDocumentComposer, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.rules_catalog import ( + RulesCatalog, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_registry import ( + TemplateRegistry, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.create_doc.steps.step1_generate_frontmatter.step import ( + GenerateFrontmatterStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.create_doc.steps.step2_generate_sections.step import ( + GenerateSectionsStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.create_doc.steps.step4_compose_document.step import ( + ComposeDocumentStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RuleDocument +from app.core.agent.utils.llm import AgentLlmService + + +class CreateDocSubprocess: + def __init__(self, llm: AgentLlmService) -> None: + self._frontmatter = GenerateFrontmatterStep(llm) + self._sections = GenerateSectionsStep(llm) + self._templates = TemplateRegistry() + self._compose = ComposeDocumentStep(TemplateDocumentComposer()) + + def run( + self, + task: RequirementTaskContext, + *, + rule_documents: list[RuleDocument], + shared_context: dict[str, object], + ) -> SubprocessResult: + catalog = RulesCatalog.from_documents(rule_documents) + template = self._templates.load(catalog, task.doc_type) + frontmatter = self._frontmatter.run(task, template=template, catalog=catalog, shared_context=shared_context) + sections = self._sections.run(task, template=template, catalog=catalog, shared_context=shared_context) + content = self._compose.run(frontmatter, template, sections, fallback_title=task.heading) + return SubprocessResult(task=task, content=content) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/prompts/prompts.yml b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/prompts/prompts.yml new file mode 100644 index 0000000..fcd3109 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/prompts/prompts.yml @@ -0,0 +1,8 @@ +namespace: v2_docs_update_v2 + +prompts: + create_frontmatter: | + Сгенерируй только frontmatter в markdown между --- и ---. + Не добавляй другие секции и не добавляй пояснений. + Используй requirement_text, template, global_rules, frontmatter_rules и shared_context. + Обязательно заполни id, title, doc_type, status, domain, sub_domain, related_docs. diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/step.py new file mode 100644 index 0000000..79b5d4d --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/step.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +import json + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.rules_catalog import ( + RulesCatalog, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_models import ( + TemplateSpec, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext +from app.core.agent.utils.llm import AgentLlmService + + +class GenerateFrontmatterStep: + def __init__(self, llm: AgentLlmService) -> None: + self._llm = llm + + def run( + self, + task: RequirementTaskContext, + *, + template: TemplateSpec, + catalog: RulesCatalog, + shared_context: dict[str, object], + ) -> str: + payload = { + "task": { + "section_key": task.section_key, + "doc_type": task.doc_type, + "id": task.doc_id, + "application": task.application, + "platform": task.platform, + "domain": task.domain, + "sub_domain": task.subdomain, + "path": task.path, + "heading": task.heading, + }, + "requirement_text": task.body, + "template": {"source_name": template.source_name, "template_text": template.template_text}, + "global_rules": catalog.global_text(), + "frontmatter_rules": catalog.section_text("global/frontmatter.md"), + "shared_context": shared_context, + } + return self._llm.generate( + "v2_docs_update_v2.create_frontmatter", + json.dumps(payload, ensure_ascii=False, indent=2), + log_context="workflow.v2.docs_update.from_feature_v2.create.frontmatter", + ).strip() diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/__init__.py new file mode 100644 index 0000000..8f4492c --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/__init__.py @@ -0,0 +1,5 @@ +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.create_doc.steps.step2_generate_sections.step import ( + GenerateSectionsStep, +) + +__all__ = ["GenerateSectionsStep"] diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/prompts/prompts.yml b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/prompts/prompts.yml new file mode 100644 index 0000000..1f354e6 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/prompts/prompts.yml @@ -0,0 +1,11 @@ +namespace: v2_docs_update_v2 + +prompts: + create_section: | + Сгенерируй содержимое одного markdown-раздела документа. + Верни только тело секции, без заголовка. + Строго следуй template.template_text, target_section.rule_text и global_rules. + Используй source_fragment как приоритетный источник фактов. + Если для секции есть структура в rule_text, заполни ее полностью, без заглушек и без фраз вида "описано отдельно". + Если source_fragment содержит "Не выявлены", это не запрещает детализировать интеграционный FR из use case, contract и shared_context. + Не ссылайся на rule-файлы в тексте документа. diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/step.py new file mode 100644 index 0000000..f98a261 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/step.py @@ -0,0 +1,91 @@ +from __future__ import annotations + +import json + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.rules_catalog import ( + RulesCatalog, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.source_sections import ( + RequirementSourceSections, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_models import ( + SectionDraft, + TemplateSpec, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext +from app.core.agent.utils.llm import AgentLlmService + + +class GenerateSectionsStep: + def __init__(self, llm: AgentLlmService, source_sections: RequirementSourceSections | None = None) -> None: + self._llm = llm + self._source_sections = source_sections or RequirementSourceSections() + + def run( + self, + task: RequirementTaskContext, + *, + template: TemplateSpec, + catalog: RulesCatalog, + shared_context: dict[str, object], + ) -> list[SectionDraft]: + source_sections = self._source_sections.extract(task.body) + drafts: list[SectionDraft] = [] + for section in template.sections: + content = self._generate_section(task, template, catalog, section.title, section.level, section.rule_path, section.has_children, source_sections, shared_context) + drafts.append(SectionDraft(title=section.title, level=section.level, content=content)) + return drafts + + def _generate_section( + self, + task: RequirementTaskContext, + template: TemplateSpec, + catalog: RulesCatalog, + title: str, + level: int, + rule_path: str, + has_children: bool, + source_sections: dict[str, str], + shared_context: dict[str, object], + ) -> str: + source_fragment = self._source_sections.find_for_title(source_sections, title) + if has_children and not source_fragment: + return "" + payload = { + "task": self._task_payload(task), + "template": { + "doc_type": template.doc_type, + "source_name": template.source_name, + "template_text": template.template_text, + "sections": [{"title": item.title, "level": item.level, "rule_path": item.rule_path} for item in template.sections], + }, + "target_section": { + "title": title, + "level": level, + "rule_path": rule_path, + "rule_text": catalog.section_text(rule_path), + }, + "source_fragment": source_fragment, + "all_source_sections": source_sections, + "global_rules": catalog.global_text(), + "shared_context": shared_context, + } + return self._llm.generate( + "v2_docs_update_v2.create_section", + json.dumps(payload, ensure_ascii=False, indent=2), + log_context=f"workflow.v2.docs_update.from_feature_v2.create.section.{title}", + ).strip() + + def _task_payload(self, task: RequirementTaskContext) -> dict[str, object]: + return { + "section_key": task.section_key, + "heading": task.heading, + "doc_type": task.doc_type, + "doc_id": task.doc_id, + "domain": task.domain, + "sub_domain": task.subdomain, + "application": task.application, + "platform": task.platform, + "path": task.path, + "requirement_text": task.body, + } diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/prompts/prompts.yml b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/prompts/prompts.yml new file mode 100644 index 0000000..cf2294c --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/prompts/prompts.yml @@ -0,0 +1,7 @@ +namespace: v2_docs_update_v2 + +prompts: + create_summary: | + Сгенерируй раздел Summary для нового документа. + Учитывай related pages из shared_context, чтобы не дублировать соседние страницы. + Верни только текст раздела, без заголовка уровня 2. diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/step.py new file mode 100644 index 0000000..62425df --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_summary/step.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +import json + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext +from app.core.agent.utils.llm import AgentLlmService + + +class GenerateSummaryStep: + def __init__(self, llm: AgentLlmService) -> None: + self._llm = llm + + def run( + self, + task: RequirementTaskContext, + requirement_text: str, + rules_text: str, + shared_context: dict[str, object], + ) -> str: + payload = { + "task": { + "section_key": task.section_key, + "doc_type": task.doc_type, + "id": task.doc_id, + "heading": task.heading, + "domain": task.domain, + "sub_domain": task.subdomain, + "path": task.path, + }, + "requirement_text": requirement_text, + "rules": rules_text, + "shared_context": shared_context, + } + return self._llm.generate( + "v2_docs_update_v2.create_summary", + json.dumps(payload, ensure_ascii=False, indent=2), + log_context="workflow.v2.docs_update.from_feature_v2.create.summary", + ).strip() diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/prompts/prompts.yml b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/prompts/prompts.yml new file mode 100644 index 0000000..e358799 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/prompts/prompts.yml @@ -0,0 +1,7 @@ +namespace: v2_docs_update_v2 + +prompts: + create_details: | + Сгенерируй раздел Details для нового документа. + Используй rules из _process/doc_rules_v3 и accumulated_pages из shared_context. + Верни только тело раздела, без заголовка уровня 2. diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/step.py new file mode 100644 index 0000000..5498d1b --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step3_generate_details/step.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +import json + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext +from app.core.agent.utils.llm import AgentLlmService + + +class GenerateDetailsStep: + def __init__(self, llm: AgentLlmService) -> None: + self._llm = llm + + def run( + self, + task: RequirementTaskContext, + requirement_text: str, + rules_text: str, + shared_context: dict[str, object], + ) -> str: + payload = { + "task": { + "section_key": task.section_key, + "doc_type": task.doc_type, + "id": task.doc_id, + "heading": task.heading, + "domain": task.domain, + "sub_domain": task.subdomain, + "path": task.path, + }, + "requirement_text": requirement_text, + "rules": rules_text, + "shared_context": shared_context, + } + return self._llm.generate( + "v2_docs_update_v2.create_details", + json.dumps(payload, ensure_ascii=False, indent=2), + log_context="workflow.v2.docs_update.from_feature_v2.create.details", + ).strip() diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step4_compose_document/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step4_compose_document/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step4_compose_document/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step4_compose_document/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step4_compose_document/step.py new file mode 100644 index 0000000..7c00932 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step4_compose_document/step.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.document_composer import ( + TemplateDocumentComposer, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_models import ( + SectionDraft, + TemplateSpec, +) + +class ComposeDocumentStep: + def __init__(self, composer: TemplateDocumentComposer | None = None) -> None: + self._composer = composer or TemplateDocumentComposer() + + def run(self, frontmatter: str, template: TemplateSpec, sections: list[SectionDraft], fallback_title: str) -> str: + return self._composer.compose(template, frontmatter, sections, fallback_title) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/__init__.py new file mode 100644 index 0000000..ba22254 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/__init__.py @@ -0,0 +1,5 @@ +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.delete_doc.process import ( + DeleteDocSubprocess, +) + +__all__ = ["DeleteDocSubprocess"] diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/process.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/process.py new file mode 100644 index 0000000..08463da --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/process.py @@ -0,0 +1,15 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common import SubprocessResult +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.delete_doc.steps.step1_build_change.step import ( + BuildDeleteChangeStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext + + +class DeleteDocSubprocess: + def __init__(self) -> None: + self._step = BuildDeleteChangeStep() + + def run(self, task: RequirementTaskContext) -> SubprocessResult: + return self._step.run(task) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/step1_build_change/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/step1_build_change/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/step1_build_change/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/step1_build_change/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/step1_build_change/step.py new file mode 100644 index 0000000..ab1fde4 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/delete_doc/steps/step1_build_change/step.py @@ -0,0 +1,9 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common import SubprocessResult +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext + + +class BuildDeleteChangeStep: + def run(self, task: RequirementTaskContext) -> SubprocessResult: + return SubprocessResult(task=task, content=None) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/__init__.py new file mode 100644 index 0000000..6b45bed --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/__init__.py @@ -0,0 +1,3 @@ +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.edit_doc.process import EditDocSubprocess + +__all__ = ["EditDocSubprocess"] diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/process.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/process.py new file mode 100644 index 0000000..1b811fe --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/process.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common import SubprocessResult +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.document_composer import ( + TemplateDocumentComposer, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.rules_catalog import ( + RulesCatalog, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_registry import ( + TemplateRegistry, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.edit_doc.steps.step1_generate_frontmatter.step import ( + EditFrontmatterStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.edit_doc.steps.step2_generate_sections.step import ( + EditSectionsStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.edit_doc.steps.step4_compose_document.step import ( + ComposeEditedDocumentStep, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RuleDocument +from app.core.agent.utils.llm import AgentLlmService + + +class EditDocSubprocess: + def __init__(self, llm: AgentLlmService) -> None: + self._frontmatter = EditFrontmatterStep(llm) + self._sections = EditSectionsStep(llm) + self._templates = TemplateRegistry() + self._compose = ComposeEditedDocumentStep(TemplateDocumentComposer()) + + def run( + self, + task: RequirementTaskContext, + *, + current_content: str, + rule_documents: list[RuleDocument], + shared_context: dict[str, object], + ) -> SubprocessResult: + catalog = RulesCatalog.from_documents(rule_documents) + template = self._templates.load(catalog, task.doc_type) + frontmatter = self._frontmatter.run( + task, + current_content=current_content, + template=template, + catalog=catalog, + shared_context=shared_context, + ) + sections = self._sections.run( + task, + current_content=current_content, + template=template, + catalog=catalog, + shared_context=shared_context, + ) + content = self._compose.run(frontmatter, template, sections, fallback_title=task.heading) + return SubprocessResult(task=task, content=content) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/prompts/prompts.yml b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/prompts/prompts.yml new file mode 100644 index 0000000..36e905c --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/prompts/prompts.yml @@ -0,0 +1,7 @@ +namespace: v2_docs_update_v2 + +prompts: + edit_frontmatter: | + Внеси изменения в frontmatter документа по requirement_text. + Учитывай template, global_rules, frontmatter_rules и новые domain/sub_domain и связи из shared_context. + Верни только frontmatter между --- и ---. diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/step.py new file mode 100644 index 0000000..a3527ed --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/step.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +import json + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.rules_catalog import ( + RulesCatalog, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_models import ( + TemplateSpec, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext +from app.core.agent.utils.llm import AgentLlmService + + +class EditFrontmatterStep: + def __init__(self, llm: AgentLlmService) -> None: + self._llm = llm + + def run( + self, + task: RequirementTaskContext, + *, + current_content: str, + template: TemplateSpec, + catalog: RulesCatalog, + shared_context: dict[str, object], + ) -> str: + payload = { + "task": { + "section_key": task.section_key, + "doc_type": task.doc_type, + "id": task.doc_id, + "heading": task.heading, + "domain": task.domain, + "sub_domain": task.subdomain, + "path": task.path, + }, + "current_content": current_content, + "requirement_text": task.body, + "template": {"source_name": template.source_name, "template_text": template.template_text}, + "global_rules": catalog.global_text(), + "frontmatter_rules": catalog.section_text("global/frontmatter.md"), + "shared_context": shared_context, + } + return self._llm.generate( + "v2_docs_update_v2.edit_frontmatter", + json.dumps(payload, ensure_ascii=False, indent=2), + log_context="workflow.v2.docs_update.from_feature_v2.edit.frontmatter", + ).strip() diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/__init__.py new file mode 100644 index 0000000..d48e4ab --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/__init__.py @@ -0,0 +1,5 @@ +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.edit_doc.steps.step2_generate_sections.step import ( + EditSectionsStep, +) + +__all__ = ["EditSectionsStep"] diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/prompts/prompts.yml b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/prompts/prompts.yml new file mode 100644 index 0000000..015840b --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/prompts/prompts.yml @@ -0,0 +1,9 @@ +namespace: v2_docs_update_v2 + +prompts: + edit_section: | + Обнови содержимое одного markdown-раздела документа. + Верни только тело секции, без заголовка. + Строго следуй template.template_text, target_section.rule_text и global_rules. + Используй source_fragment как приоритетный источник фактов и сохраняй согласованность с current_content. + Не оставляй заглушки, само-ссылки и фразы вида "описано отдельно". diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/step.py new file mode 100644 index 0000000..1a20564 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/step.py @@ -0,0 +1,91 @@ +from __future__ import annotations + +import json + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.rules_catalog import ( + RulesCatalog, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.source_sections import ( + RequirementSourceSections, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_models import ( + SectionDraft, + TemplateSpec, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext +from app.core.agent.utils.llm import AgentLlmService + + +class EditSectionsStep: + def __init__(self, llm: AgentLlmService, source_sections: RequirementSourceSections | None = None) -> None: + self._llm = llm + self._source_sections = source_sections or RequirementSourceSections() + + def run( + self, + task: RequirementTaskContext, + *, + current_content: str, + template: TemplateSpec, + catalog: RulesCatalog, + shared_context: dict[str, object], + ) -> list[SectionDraft]: + source_sections = self._source_sections.extract(task.body) + drafts: list[SectionDraft] = [] + for section in template.sections: + content = self._generate_section(task, current_content, template, catalog, section.title, section.level, section.rule_path, section.has_children, source_sections, shared_context) + drafts.append(SectionDraft(title=section.title, level=section.level, content=content)) + return drafts + + def _generate_section( + self, + task: RequirementTaskContext, + current_content: str, + template: TemplateSpec, + catalog: RulesCatalog, + title: str, + level: int, + rule_path: str, + has_children: bool, + source_sections: dict[str, str], + shared_context: dict[str, object], + ) -> str: + source_fragment = self._source_sections.find_for_title(source_sections, title) + if has_children and not source_fragment: + return "" + payload = { + "task": { + "section_key": task.section_key, + "heading": task.heading, + "doc_type": task.doc_type, + "doc_id": task.doc_id, + "domain": task.domain, + "sub_domain": task.subdomain, + "application": task.application, + "platform": task.platform, + "path": task.path, + "requirement_text": task.body, + }, + "current_content": current_content, + "template": { + "doc_type": template.doc_type, + "source_name": template.source_name, + "template_text": template.template_text, + "sections": [{"title": item.title, "level": item.level, "rule_path": item.rule_path} for item in template.sections], + }, + "target_section": { + "title": title, + "level": level, + "rule_path": rule_path, + "rule_text": catalog.section_text(rule_path), + }, + "source_fragment": source_fragment, + "all_source_sections": source_sections, + "global_rules": catalog.global_text(), + "shared_context": shared_context, + } + return self._llm.generate( + "v2_docs_update_v2.edit_section", + json.dumps(payload, ensure_ascii=False, indent=2), + log_context=f"workflow.v2.docs_update.from_feature_v2.edit.section.{title}", + ).strip() diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/prompts/prompts.yml b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/prompts/prompts.yml new file mode 100644 index 0000000..2c2267c --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/prompts/prompts.yml @@ -0,0 +1,7 @@ +namespace: v2_docs_update_v2 + +prompts: + edit_summary: | + Обнови только раздел Summary документа по requirement_text. + Сохраняй согласованность с accumulated_pages из shared_context. + Верни только тело Summary без заголовка. diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/step.py new file mode 100644 index 0000000..9ae31ca --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_summary/step.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +import json + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext +from app.core.agent.utils.llm import AgentLlmService + + +class EditSummaryStep: + def __init__(self, llm: AgentLlmService) -> None: + self._llm = llm + + def run( + self, + task: RequirementTaskContext, + current_content: str, + rules_text: str, + shared_context: dict[str, object], + ) -> str: + payload = { + "task": { + "section_key": task.section_key, + "doc_type": task.doc_type, + "id": task.doc_id, + "heading": task.heading, + "domain": task.domain, + "sub_domain": task.subdomain, + "path": task.path, + }, + "current_content": current_content, + "requirement_text": task.body, + "rules": rules_text, + "shared_context": shared_context, + } + return self._llm.generate( + "v2_docs_update_v2.edit_summary", + json.dumps(payload, ensure_ascii=False, indent=2), + log_context="workflow.v2.docs_update.from_feature_v2.edit.summary", + ).strip() diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/prompts/prompts.yml b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/prompts/prompts.yml new file mode 100644 index 0000000..847c14f --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/prompts/prompts.yml @@ -0,0 +1,7 @@ +namespace: v2_docs_update_v2 + +prompts: + edit_details: | + Обнови только раздел Details документа по requirement_text. + Учитывай rules и взаимосвязанные страницы из shared_context. + Верни только тело Details без заголовка. diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/step.py new file mode 100644 index 0000000..c8720cb --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step3_generate_details/step.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +import json + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import RequirementTaskContext +from app.core.agent.utils.llm import AgentLlmService + + +class EditDetailsStep: + def __init__(self, llm: AgentLlmService) -> None: + self._llm = llm + + def run( + self, + task: RequirementTaskContext, + current_content: str, + rules_text: str, + shared_context: dict[str, object], + ) -> str: + payload = { + "task": { + "section_key": task.section_key, + "doc_type": task.doc_type, + "id": task.doc_id, + "heading": task.heading, + "domain": task.domain, + "sub_domain": task.subdomain, + "path": task.path, + }, + "current_content": current_content, + "requirement_text": task.body, + "rules": rules_text, + "shared_context": shared_context, + } + return self._llm.generate( + "v2_docs_update_v2.edit_details", + json.dumps(payload, ensure_ascii=False, indent=2), + log_context="workflow.v2.docs_update.from_feature_v2.edit.details", + ).strip() diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step4_compose_document/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step4_compose_document/__init__.py new file mode 100644 index 0000000..040eb75 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step4_compose_document/__init__.py @@ -0,0 +1 @@ +"""Auto-generated package init.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step4_compose_document/step.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step4_compose_document/step.py new file mode 100644 index 0000000..ecf0bfa --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step4_compose_document/step.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.document_composer import ( + TemplateDocumentComposer, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_models import ( + SectionDraft, + TemplateSpec, +) + +class ComposeEditedDocumentStep: + def __init__(self, composer: TemplateDocumentComposer | None = None) -> None: + self._composer = composer or TemplateDocumentComposer() + + def run(self, frontmatter: str, template: TemplateSpec, sections: list[SectionDraft], fallback_title: str) -> str: + return self._composer.compose(template, frontmatter, sections, fallback_title) diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/__init__.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/__init__.py new file mode 100644 index 0000000..a76c6f5 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/__init__.py @@ -0,0 +1 @@ +"""Runtime helpers for DOC_UPDATE/FROM_FEATURE v2 workflow.""" diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/buffered_graph.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/buffered_graph.py new file mode 100644 index 0000000..9a0dfae --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/buffered_graph.py @@ -0,0 +1,112 @@ +from __future__ import annotations + +from typing import TypeVar + +from app.core.agent.utils.workflow.context import WorkflowContext +from app.core.agent.utils.workflow.graph import WorkflowGraph + +TContext = TypeVar("TContext", bound=WorkflowContext) + + +class DocUpdateFromFeatureV2WorkflowGraph(WorkflowGraph[TContext]): + async def run(self, context: TContext) -> TContext: + trace = context.runtime.trace.module(self._source) + trace.log("workflow_started", {"workflow_id": self._workflow_id}) + steps_buffer: list[dict[str, object]] = [] + for step in self._steps: + before = self._snapshot(context) + raw_inp = step.trace_input(context) + inp = self._merge_trace_payload(raw_inp, before) + request_id = context.runtime.request.request_id + await context.runtime.publisher.publish_status( + request_id, + self._source, + f"Шаг workflow: {step.title}.", + {"workflow_id": self._workflow_id, "step_id": step.step_id}, + ) + context = await step.run(context) + after = self._snapshot(context) + raw_out = step.trace_output(context) + out = self._merge_trace_payload(raw_out, after) + trace.log( + "workflow_step_traced", + { + "workflow_id": self._workflow_id, + "step": {"id": step.step_id, "title": step.title}, + "input": inp, + "output": out, + }, + ) + steps_buffer.append({"step_id": step.step_id, "title": step.title, "input": inp, "output": out}) + trace.log("workflow_trace_flushed", {"workflow_id": self._workflow_id, "steps": steps_buffer}) + trace.log("workflow_completed", {"workflow_id": self._workflow_id}) + return context + + def _merge_trace_payload(self, payload: dict[str, object] | None, snapshot: dict[str, object]) -> dict[str, object]: + if not payload: + return snapshot + merged = dict(payload) + merged["_context"] = snapshot + return merged + + def _snapshot(self, context: TContext) -> dict[str, object]: + analytics = getattr(context, "analytics_meta", None) + requirements = list(getattr(context, "requirements", []) or []) + tasks = list(getattr(context, "requirement_tasks", []) or []) + rules = list(getattr(context, "rules", []) or []) + changeset = list(getattr(context, "changeset", []) or []) + issues = list(getattr(context, "issues", []) or []) + accumulated = list(getattr(context, "accumulated_pages", []) or []) + return { + "source_kind": str(getattr(context, "source_kind", "") or ""), + "source_ref": str(getattr(context, "source_ref", "") or ""), + "project_root": str(getattr(context, "project_root", "") or ""), + "source_content_len": len(str(getattr(context, "source_content", "") or "")), + "analysis_id": str(getattr(analytics, "analysis_id", "") or ""), + "application": str(getattr(analytics, "application", "") or ""), + "platform": str(getattr(analytics, "platform", "") or ""), + "domain": str(getattr(analytics, "domain", "") or ""), + "sub_domain": str(getattr(analytics, "subdomain", "") or ""), + "requirements_count": len(requirements), + "requirements_preview": [ + { + "section_key": str(getattr(item, "section_key", "") or ""), + "heading": str(getattr(item, "heading", "") or ""), + } + for item in requirements[:6] + ], + "docs_rows_count": len(list(getattr(context, "docs_catalog_rows", []) or [])), + "tasks_count": len(tasks), + "tasks_preview": [ + { + "section_key": str(getattr(item, "section_key", "") or ""), + "action": str(getattr(getattr(item, "action", None), "value", "") or ""), + "path": str(getattr(item, "path", "") or ""), + "doc_type": str(getattr(item, "doc_type", "") or ""), + "platform": str(getattr(item, "platform", "") or ""), + } + for item in tasks[:8] + ], + "rules_count": len(rules), + "rule_names_preview": [str(getattr(item, "name", "") or "") for item in rules[:8]], + "changeset_count": len(changeset), + "changeset_preview": [ + { + "op": str(getattr(item, "op", "") or ""), + "path": str(getattr(item, "path", "") or ""), + } + for item in changeset[:8] + ], + "accumulated_pages_count": len(accumulated), + "accumulated_pages_preview": [ + { + "path": str(getattr(item, "path", "") or ""), + "action": str(getattr(getattr(item, "action", None), "value", "") or ""), + } + for item in accumulated[:8] + ], + "apply_changeset": bool(getattr(context, "apply_changeset", False)), + "answer_len": len(str(getattr(context, "answer", "") or "")), + "issues_count": len(issues), + "issues_preview": [str(item) for item in issues[:8]], + } diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/context.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/context.py new file mode 100644 index 0000000..a8cdec3 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/context.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +from dataclasses import dataclass, field + +from app.core.agent.runtime.execution_context import RuntimeExecutionContext +from app.core.agent.utils.process_v2.models import V2RouteResult +from app.schemas.changeset import ChangeItem +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import ( + AccumulatedPageDraft, + AnalyticsMeta, + RequirementTaskContext, + RequirementUnit, + RuleDocument, +) + + +@dataclass(slots=True) +class DocUpdateFromFeatureV2Context: + runtime: RuntimeExecutionContext + route: V2RouteResult + rag_session_id: str + source_ref: str = "" + source_kind: str = "" + project_root: str = "" + source_content: str = "" + analytics_meta: AnalyticsMeta = field(default_factory=AnalyticsMeta) + requirements: list[RequirementUnit] = field(default_factory=list) + rules: list[RuleDocument] = field(default_factory=list) + docs_catalog_rows: list[dict] = field(default_factory=list) + requirement_tasks: list[RequirementTaskContext] = field(default_factory=list) + accumulated_pages: list[AccumulatedPageDraft] = field(default_factory=list) + changeset: list[ChangeItem] = field(default_factory=list) + apply_changeset: bool = False + issues: list[str] = field(default_factory=list) + answer: str = "" + answer_generated_payload: dict[str, object] | None = None diff --git a/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/models.py b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/models.py new file mode 100644 index 0000000..2a8abb5 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/workflow_runtime/models.py @@ -0,0 +1,62 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from enum import Enum + + +class DocAction(str, Enum): + CREATE = "create" + EDIT = "update" + DELETE = "delete" + + +@dataclass(slots=True) +class AnalyticsMeta: + analysis_id: str = "" + application: str = "" + platform: str = "" + domain: str = "" + subdomain: str = "" + + +@dataclass(slots=True) +class RequirementUnit: + section_key: str + heading: str + body: str + metadata: dict[str, object] = field(default_factory=dict) + + +@dataclass(slots=True) +class RequirementTaskContext: + index: int + section_key: str + heading: str + body: str + metadata: dict[str, object] + doc_type: str = "" + doc_id: str = "" + application: str = "" + platform: str = "" + domain: str = "" + subdomain: str = "" + action: DocAction = DocAction.CREATE + path: str = "" + issues: list[str] = field(default_factory=list) + + +@dataclass(slots=True) +class AccumulatedPageDraft: + path: str + heading: str + doc_id: str + doc_type: str + platform: str + action: DocAction + content: str = "" + + +@dataclass(slots=True) +class RuleDocument: + name: str + content: str diff --git a/src/app/core/application.py b/src/app/core/application.py index 31893ed..35952dc 100644 --- a/src/app/core/application.py +++ b/src/app/core/application.py @@ -61,6 +61,16 @@ class ModularApplication: / "agent/processes/v2/workflows/general_qa_summary/steps/prompts/prompts.yml", Path(__file__).resolve().parent / "agent/processes/v2/workflows/doc_update_from_feature/steps/prompts/prompts.yml", + Path(__file__).resolve().parent + / "agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/prompts/prompts.yml", + Path(__file__).resolve().parent + / "agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/prompts/prompts.yml", + Path(__file__).resolve().parent + / "agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/prompts/prompts.yml", + Path(__file__).resolve().parent + / "agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/prompts/prompts.yml", + Path(__file__).resolve().parent + / "agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/prompts/prompts.yml", Path(__file__).resolve().parent / "agent/processes/v2/intent_router/routers/prompts.yml", ] ) @@ -72,6 +82,7 @@ class ModularApplication: _v2_evidence = DocsEvidenceAssembler() _v2_policy = V2RetrievalPolicyResolver() _doc_rules_enabled = os.getenv("V2_DOC_RULES_ENABLED", "true").strip().lower() in {"1", "true", "yes"} + _doc_update_workflow_version = os.getenv("V2_DOC_UPDATE_WORKFLOW_VERSION", "v2").strip().lower() or "v2" self.agent_sessions = InMemorySessionStore() self.agent_requests = InMemoryRequestStore() @@ -94,6 +105,7 @@ class ModularApplication: router=V2IntentRouter(llm=self._v2_llm), workflow_llm_enabled=True, doc_rules_enabled=_doc_rules_enabled, + doc_update_workflow_version=_doc_update_workflow_version, ), ] ) diff --git a/tests/pipeline_setup_v3/runtime/v2_process_adapter.py b/tests/pipeline_setup_v3/runtime/v2_process_adapter.py index 7d9dd55..7a337b4 100644 --- a/tests/pipeline_setup_v3/runtime/v2_process_adapter.py +++ b/tests/pipeline_setup_v3/runtime/v2_process_adapter.py @@ -250,6 +250,16 @@ def _build_v2_llm() -> AgentLlmService: / "src/app/core/agent/processes/v2/workflows/doc_explain_summary/steps/prompts/prompts.yml", Path(__file__).resolve().parents[3] / "src/app/core/agent/processes/v2/workflows/general_qa_summary/steps/prompts/prompts.yml", + Path(__file__).resolve().parents[3] + / "src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/steps/step5_execute_subprocesses/prompts/prompts.yml", + Path(__file__).resolve().parents[3] + / "src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step1_generate_frontmatter/prompts/prompts.yml", + Path(__file__).resolve().parents[3] + / "src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step1_generate_frontmatter/prompts/prompts.yml", + Path(__file__).resolve().parents[3] + / "src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/create_doc/steps/step2_generate_sections/prompts/prompts.yml", + Path(__file__).resolve().parents[3] + / "src/app/core/agent/processes/v2/workflows/doc_update_from_feature_v2/subprocesses/edit_doc/steps/step2_generate_sections/prompts/prompts.yml", Path(__file__).resolve().parents[3] / "src/app/core/agent/processes/v2/intent_router/routers/prompts.yml", ] return AgentLlmService(client=_build_client(), prompts=PromptLoader(prompt_paths)) diff --git a/tests/unit_tests/agent/test_doc_update_from_feature_v2_happy_path.py b/tests/unit_tests/agent/test_doc_update_from_feature_v2_happy_path.py new file mode 100644 index 0000000..395aceb --- /dev/null +++ b/tests/unit_tests/agent/test_doc_update_from_feature_v2_happy_path.py @@ -0,0 +1,236 @@ +from __future__ import annotations + +from types import SimpleNamespace + +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step3_parse_requirements.parser import ( + FunctionalRequirementsParser, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step4_prepare_tasks.services import ( + RequirementTaskBuilder, + RequirementTaskOrderer, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.steps.step5_execute_subprocesses.classifier import ( + DeleteIntentHeuristic, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.source_sections import ( + RequirementSourceSections, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.subprocesses.common.template_parser import ( + TemplateParser, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.context import ( + DocUpdateFromFeatureV2Context, +) +from app.core.agent.processes.v2.workflows.doc_update_from_feature_v2.workflow_runtime.models import ( + AnalyticsMeta, + RequirementUnit, +) + + +class _UnexpectedLlmCall: + def generate(self, *args, **kwargs): # noqa: ANN002, ANN003 + raise AssertionError("LLM should not be called for explicit happy-path metadata.") + + +def test_parser_reads_section_6_metadata_and_units() -> None: + parser = FunctionalRequirementsParser() + content = """ +analysis_id: AN-42 +application: loyalty +platform: web + +# 6. Функциональные требования +domain: billing +sub_domain: payments + +## 6.1 Экран статуса платежа +id: payment-status +doc_type: ui_page +application: loyalty +platform: pprb + +### Функциональные требования +- Показываем статус и ошибку. + +## 6.2 Метод получения статуса +id: get-payment-status +doc_type: api_method +application: loyalty +platform: ufs + +### Контракт метода +- GET /payments/status +""".strip() + + meta, units = parser.parse(content) + + assert meta.analysis_id == "AN-42" + assert meta.application == "loyalty" + assert meta.platform == "web" + assert meta.domain == "billing" + assert meta.subdomain == "payments" + assert [unit.section_key for unit in units] == ["6.1", "6.2"] + assert [unit.heading for unit in units] == ["Экран статуса платежа", "Метод получения статуса"] + assert units[0].metadata["doc_type"] == "ui_page" + assert "Показываем статус" in units[0].body + + +def test_parser_reads_backticked_root_metadata_format() -> None: + parser = FunctionalRequirementsParser() + content = """ +# 6. Описание изменений + +- `domain`: `orders` +- `sub_domain`: `list_read` + +## 6.1 Страница списка заказов +id: orders.ui.list +doc_type: ui_page +application: orders_web +platform: web + +### Требования к UI +- Таблица заказов. +""".strip() + + meta, units = parser.parse(content) + + assert meta.domain == "orders" + assert meta.subdomain == "list_read" + assert len(units) == 1 + assert units[0].metadata["doc_type"] == "ui_page" + + +def test_task_builder_orders_platforms_and_inherits_root_context() -> None: + context = DocUpdateFromFeatureV2Context( + runtime=SimpleNamespace(), + route=SimpleNamespace(), + rag_session_id="", + analytics_meta=AnalyticsMeta( + analysis_id="AN-42", + application="loyalty", + domain="billing", + subdomain="payments", + ), + requirements=[ + RequirementUnit( + section_key="6.3", + heading="WEB страница", + body="Описание", + metadata={"id": "web-page", "doc_type": "ui_page", "platform": "web", "op": "create"}, + ), + RequirementUnit( + section_key="6.1", + heading="PPRB страница", + body="Описание", + metadata={"id": "pprb-page", "doc_type": "ui_page", "platform": "pprb", "op": "create"}, + ), + RequirementUnit( + section_key="6.2", + heading="UFS метод", + body="Описание", + metadata={"id": "ufs-method", "doc_type": "api_method", "platform": "ufs", "op": "create"}, + ), + ], + ) + builder = RequirementTaskBuilder(_UnexpectedLlmCall()) + orderer = RequirementTaskOrderer() + + tasks = orderer.order(builder.build(context)) + + assert [task.platform for task in tasks] == ["pprb", "ufs", "web"] + assert [task.section_key for task in tasks] == ["6.1", "6.2", "6.3"] + assert all(task.application == "loyalty" for task in tasks) + assert all(task.domain == "billing" for task in tasks) + assert all(task.subdomain == "payments" for task in tasks) + assert tasks[0].path == "docs/billing/pprb/ui_page/pprb-page.md" + + +def test_task_builder_uses_create_when_path_is_new_and_no_delete_markers() -> None: + context = DocUpdateFromFeatureV2Context( + runtime=SimpleNamespace(), + route=SimpleNamespace(), + rag_session_id="", + analytics_meta=AnalyticsMeta( + application="orders_web", + domain="orders", + subdomain="list_read", + ), + requirements=[ + RequirementUnit( + section_key="6.1", + heading="Страница списка заказов", + body="### Требования к UI\n- Показывать таблицу заказов.", + metadata={ + "id": "orders.ui.list", + "doc_type": "ui_page", + "application": "orders_web", + "platform": "web", + }, + ) + ], + ) + + tasks = RequirementTaskBuilder(_UnexpectedLlmCall()).build(context) + + assert len(tasks) == 1 + assert tasks[0].action.value == "create" + assert tasks[0].path == "docs/orders/web/ui_page/orders.ui.list.md" + + +def test_delete_heuristic_does_not_match_phrase_ne_udalos() -> None: + heuristic = DeleteIntentHeuristic() + + assert heuristic.is_delete("Не удалось загрузить список заказов.") is False + assert heuristic.is_delete("Нужно удалить существующую страницу документации.") is True + + +def test_template_parser_extracts_ordered_sections_from_ui_template() -> None: + parser = TemplateParser() + template = """ +--- +doc_type: ui_page +--- + +# <title> + +## Summary +Правила оформления: `../common-elements/summary.md` + +## Details +Правила оформления: `../common-elements/details.md` + +### Требования к UI +Правила оформления: `../common-elements/ui-requirements.md` +""".strip() + + spec = parser.parse("templates/ui_page.template.md", template) + + assert spec.doc_type == "ui_page" + assert spec.title_level == 1 + assert [(item.level, item.title, item.rule_path) for item in spec.sections] == [ + (2, "Summary", "common-elements/summary.md"), + (2, "Details", "common-elements/details.md"), + (3, "Требования к UI", "common-elements/ui-requirements.md"), + ] + assert spec.sections[1].has_children is True + + +def test_requirement_source_sections_match_template_titles() -> None: + locator = RequirementSourceSections() + body = """ +### Технический use case (тезисно) +1. Открыть экран. + +### Контракт метода +| Поле | Тип | + +### Нефункциональные требования +- Метрики. +""".strip() + + sections = locator.extract(body) + + assert "открыть экран" not in sections + assert locator.find_for_title(sections, "Технический use case") == "1. Открыть экран." + assert "| Поле | Тип |" in locator.find_for_title(sections, "Контракт")